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 :

WPF - DataGrid du WPFToolKit : Accéder aux cellules pendant le chargement de la page


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut WPF - DataGrid du WPFToolKit : Accéder aux cellules pendant le chargement de la page
    Bonjour,

    Je souhaiterais accéder aux cellules et aux lignes d'une dataGrid (objet du WPFToolkit) pendant le chargement de ma fenêtre de type window.

    Je souhaite y accéder pendant le chargement car je voudrais affecter dans des colonnes une valeur (ou binding) provenant d'une autre DataTable que celle affectée dans l'ItemsSource de ma datagrid.

    J'arrive à accéder aux cellules et aux lignes une fois ma window chargée, en utilisant la méthode VisualTreeHelper.GetChildrenCount. Je ne peux pas utiliser cette méthode pendant le chargement de ma window.

    Comment puis-je faire pour accéder aux cellules / lignes pendant le chargement d'une window ?
    Ou comment faire pour avoir plusieurs DataTable dans un ItemsSource d'une DataGrid ?

    Merci

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Citation Envoyé par YHDVP
    Comment puis-je faire pour accéder aux cellules / lignes pendant le chargement d'une window ?
    En fait, il faudrait que tu essaies dans l'évènement Loaded de ta Window (ou celui de ta DataGrid)


    Citation Envoyé par YHDVP
    Ou comment faire pour avoir plusieurs DataTable dans un ItemsSource d'une DataGrid ?
    Tu peux créer un objet à toi qui est construit à partir des différentes DataTable. Et c'est ce ce nouvel objet que tu associeras à l'ItemsSource de ta DataGrid.

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Mon traitement est bien effectué dans le Load de ma window.
    Pour accéder à une ligne, lorsque je ne suis pas dans un Load mais dans un click par exemple, j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Recherche de la ligne if ((datagrid == null) || (VisualTreeHelper.GetChildrenCount(datagrid) == 0)) return null; DataGridRowsPresenter dgrPanel = FindFirstOfType<DataGridRowsPresenter>(datagrid);
    if ((dgrPanel == null) || (VisualTreeHelper.GetChildrenCount(dgrPanel) <= intNumLigne)) return null; DataGridRow dgrLigne = VisualTreeHelper.GetChild(dgrPanel, intNumLigne) as DataGridRow;
    // Recherche du champs if ((dgrLigne == null) || (VisualTreeHelper.GetChildrenCount(dgrLigne) == 0)) return null; DataGridCellsPanel dgcPanel = FindFirstOfType<DataGridCellsPanel>(dgrLigne); if ((dgcPanel == null) || (VisualTreeHelper.GetChildrenCount(dgcPanel)< intNumColonne) || (intNbColonne <= 0) ) return null;
    DataGridCell dgcCellule = VisualTreeHelper.GetChild(dgcPanel, intNumColonne) as DataGridCell;
    Le problème est que lorsque je suis dans un Load je ne peux pas utiliser VisualTreeHelper car on n'a pas encore le visuel.

    Concernant l'ItemsSource j'ai déjà mon objet DataSet contenant plusieurs tables et je ne souhaite pas le modifier.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Est-ce que le problème est le même si tu place ton code dans l'évènement Loaded de ta dataGrid ?

    Sinon tu peut peut-être tenté d'accéder aux objets directement et modifier les valeurs qui vont biens. Tu récupère l'ItemsSource et tu le cast, soit quelque chose comme ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    (dataGrid.ItemsSource as DataSet)

    Ce sera plus performant que d'utiliser VisualTreeHelper.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    D'ailleurs pour le clic, j'éviterai aussi le VisualTreeHelper. Je passerai par l'event MouseDown de la DataGridCell directement :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dg:DataGrid ... >
     
      <dg:DataGrid.Resources>
     
        <Style TargetType="{x:Type dg:DataGridCell}">
          <EventSetter Event="MouseDown" Handler="DgCell_MouseDown" />
        </Style>
     
      </dg:DataGrid.Resources>
    </dg:DataGrid>

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        void DgCell_MouseDown(object sender, MouseButtonEventArgs e) {
          DataGridCell dgCell = (DataGridCell)sender;
     
        }

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Tant que la window n'est pas visible, impossible d'accéder aux cellules avec VisualTreeHelper, y compris dans le Loaded de la DataGrid.
    J'ai même essayé dans l'évènement dataGrid_LoadingRow d'abonner un évènement row.Loaded += new RoutedEventHandler(row_Loaded); sur chaque DataRow mais sans succès car la DataGrid n'est pas visible (Idem avec row.IsVisibleChanged += new DependencyPropertyChangedEventHandler(row_IsVisibleChanged); car on y passe pas au chargement).

    En fait, j'ai un DataSet avec plusisieurs DataTable.
    Ma DataGrid a 3 colonnes de la DataTable1 et 1 colonne C1 de la DataTable2, sachant que la colonne C1 est une clé étrangère de la DataTable1.

    Je souhaiterais "Binder" mes 3 colonnes avec les colonnes de ma DataTable1 et ma colonne C1 avec une colonne de ma DataTable2

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    J'ai réussi à accéder aux cellule de ma DataGrid pendant le chargement de ma Window et ainsi je peux modifier la valeur d'une DataGridCell qui n'a pas de binding définie (Sa valeur est lue dans une autre DataTable de mon DataSet)

    Je déclare un évènement Loaded sur chacune des DataGridRow de ma DataGrid dans l'évènement LoadingRow.

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <msWpfTk:DataGrid Name="maDataGrid" LoadingRow="maDataGrid_LoadingRow">

    Code c# : 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
    private void maDataGrid_LoadingRow(object sender, Microsoft.Windows.Controls.DataGridRowEventArgs e)
    {
          try
          {
                ((DataGridRow)e.Row).Loaded += new RoutedEventHandler(maDataGrid_Loaded);
          }
          catch (Exception ex)
          {
                ...
          }
          finally
          {
          }
    }
     
    void maDataGrid_Loaded(object sender, RoutedEventArgs e)
    {
          try
          {
                // Accès à ma cellule en utilisant VisualTreeHelper
          }
          catch (Exception ex)
          {
                ...
          }
          finally
          {
          }
    }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/07/2010, 11h42
  2. Réponses: 3
    Dernier message: 10/08/2007, 10h32
  3. Réponses: 3
    Dernier message: 05/06/2007, 17h01
  4. Réponses: 3
    Dernier message: 29/11/2006, 10h45
  5. Attente pendant le chargement de la page
    Par softflower dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 11/01/2006, 16h27

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