IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Problème de sélection avec un DataGrid et un TabControl


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut Problème de sélection avec un DataGrid et un TabControl
    Yep vous tous,

    Un ami m'a parlé du problème suivant :

    Un DataGrid est placé dans un TabControl. A chaque fois que l'on sélectionne un enregistrement du DataGrid, l'événement de sélection est remonté dans celui du TabControl (changement d'onglet).
    Si on a le malheur de charger le DataGrid dans ce dernier événement, alors le DataGrid se charge en boucle et il devient impossible de sélectionner un enregistrement...

    Quelqu'un as t'il une explication ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    TabControl MonTabControl = new TabControl();
    DataGrid MonDataGrid = new DataGrid();
    System.Data.DataTable MaTable;
     
    protected void DataGridSelectionExample()
    {
      // Changement d'onglet dans le TabControl.
      MonTabControl.SelectionChanged += (te, ts) =>
      {
    	// Appelé à chaque fois que l'on sélectionne un enregistrement dans MonDataGrid.
    	// Du coup, impossible rendre visible l'enregistrement sélectionné dans la grille.
    	ChargerMonDataGrid();
      };
     
      // Changement de sélection d'enregistrement dans le DataGrid.
      MonDataGrid.SelectionChanged += (de, ds) =>
      {
    	// Cet événement remonte vers le SelectionChanged du TabControl.
      };
    }
     
    protected void ChargerMonDataGrid()
    {
      MaTable = new System.Data.DataTable();
      // ...
      MonDataGrid.ItemsSource = MaTable.Rows;
    }
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  2. #2
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Voici un code fonctionnel mais qui démontre le problème, perso j'ai pas trouvé la solution, je trouve cela très étrange comme comportement

    Le code XAML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <Window x:Class="WpfFabian.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <TabControl Name="tabControl1" VerticalAlignment="Stretch"  HorizontalAlignment="Stretch" SelectionChanged="tabControl1_SelectionChanged">
                <TabItem Header="tabItem1" Name="tabItem1">
                    <Grid>
                        <DataGrid AutoGenerateColumns="True" HorizontalAlignment="Stretch"  Name="dg1" VerticalAlignment="Stretch" />
                    </Grid>
                </TabItem>
                <TabItem Header="tabItem2" Name="tabItem2">
                    <Grid>
                        <DataGrid AutoGenerateColumns="True" HorizontalAlignment="Stretch"  Name="dg2" VerticalAlignment="Stretch" />
                    </Grid>
                </TabItem>
     
            </TabControl>
        </Grid>
    </Window>
    Le code Behind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Data;
     
    namespace WpfFabian
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private DataSet locDs = null;
            private bool  bIsShowData = false;
     
            public MainWindow()
            {
                InitializeComponent();
            }
     
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                locDs = new DataSet();
     
                CreateTable("TABLE1", 5);
                CreateTable("TABLE2", 10);
     
                tabControl1.SelectedIndex = 0;
                tabControl1_SelectionChanged(null, null);
            }
     
            private void CreateTable(string sTableName, int nRow)
            {
                locDs.Tables.Add(sTableName);
                locDs.Tables[sTableName].Columns.Add("Col1");
                locDs.Tables[sTableName].Columns.Add("Col2");
                locDs.Tables[sTableName].Columns.Add("Col3");
     
                int i = 0;
     
                DataRow dr;
                for (i = 0; i < nRow; i++)
                {
                    dr = locDs.Tables[sTableName].NewRow();
                    dr["Col1"] = i.ToString() + ".1";
                    dr["Col2"] = i.ToString() + ".2";
                    dr["Col3"] = i.ToString() + ".3";
                    locDs.Tables[sTableName].Rows.Add(dr);
                }
            }
     
            private void ChargerDataGrid(int nTabIndex)
            {
                if (locDs == null)
                    return;
     
                if (nTabIndex == 0)
                {
                    dg1.ItemsSource = locDs.Tables["TABLE1"].Rows;
                }
                else
                {
                    dg2.ItemsSource = locDs.Tables["TABLE2"].Rows;
                }
            }
     
            private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                int index = tabControl1.SelectedIndex;
     
                ChargerDataGrid(index);
            }
        }
    }
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    A chaque fois que l'on sélectionne un enregistrement du DataGrid, l'événement de sélection est remonté dans celui du TabControl (changement d'onglet).
    Je ne vois aucun bout de code lié à un event du DataGrid.
    Si c'est bien le cas, le comportement est effectivement incompréhensible!

  4. #4
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Et effectivement je n'y comprends rien car le code complet que j'ai mis en exemple montre bien le problème.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  5. #5
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Il n'y a pas de problème, juste une explication

    Selector.SelectionChanged est un événement routé !. Cela permet de lever les événements aux contrôles parents.

    Pour plus d'infos du "pourquoi du comment" : Vue d'ensemble des événements routés

    Si cela vous pose problème, vous pouvez faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DataGrid AutoGenerateColumns="True" HorizontalAlignment="Stretch"  Name="dg1" VerticalAlignment="Stretch" SelectionChanged="SelectionChanged" />
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        e.Handled = true;
    }

  6. #6
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Et bien merci Etanne, je ne connaissais pas du tout ce concept, j'ai encore appris quelque chose.

    Et merci de la part de mon ami également qui bloquait un peu sur ce soucis
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête sélection avec SQLite
    Par janyoura dans le forum Android
    Réponses: 8
    Dernier message: 12/12/2012, 23h04
  2. problème de sélection avec les champs vides
    Par danathane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 16h45
  3. [ASP.NEt]Problème d'affichage avec un DataGrid
    Par Irish dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/03/2007, 09h55
  4. Problème de sélection avec LIKE
    Par Mr. Smith dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/08/2006, 19h37
  5. [FLASH MX2004] Problème avec un datagrid & xml
    Par cedonline dans le forum Flash
    Réponses: 72
    Dernier message: 15/11/2005, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo