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 :

CheckBox dans un DataGrid donne un ContentPresenter


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut CheckBox dans un DataGrid donne un ContentPresenter
    Bonjour à tous,

    J'ai actuellement une fenêtre avec un DataGrid qui comporte une CheckBox via une DataGridTemplateColumn.

    Pour tenter de récupérer la checkbox de chaque enregistrement, j'utilise l'événement LoadingRow de la DataGrid et j'essaye de récupérer le contenu de la cellule qui m'intéresse (en récupérant une DataGridCell).

    Le problème, c'est que comme contenu de cellule je ne peux récupérer qu'un ContentPresenter qui ne m'aide pas du tout, puisque son contenu à lui (.Content) n'est pas une CheckBox mais un DataRowView. Donc pas moyen de récupérer la checkbox telle quelle.

    De la même manière, en parcourant toutes les checkbox présentes dans ma DataGrid à l'aide du VisualTreeHelper, je me rends compte qu'aucune d'entre elles n'a de parent....

    Comment faire en sorte que le ContentPresenter en question puisse me donner accès à la checkbox qui m'intéresse ?

    Voici 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
    22
     
    <wpftk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="2,2,2,2" x:Name="grdApplicationStates" AlternatingRowBackground="#DBE6F7" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" CanUserAddRows="False" HorizontalScrollBarVisibility="Hidden" IsTextSearchEnabled="True" RowHeight="18" RowHeaderWidth="0" SelectionMode="Single" VerticalGridLinesBrush="#688CAF" HorizontalGridLinesBrush="#688CAF">
                                <wpftk:DataGrid.Columns>
                                    <wpftk:DataGridTemplateColumn Width="35">
                                        <wpftk:DataGridTemplateColumn.HeaderTemplate>
                                            <DataTemplate>
                                                <CheckBox x:Name="chkCheckAll" Checked="chkCheckAll_Checked" Unchecked="chkCheckAll_Unchecked" Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                                            </DataTemplate>                                        
                                        </wpftk:DataGridTemplateColumn.HeaderTemplate>                                    
                                        <wpftk:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <CheckBox x:Name="chkCheckRow" IsChecked="{Binding IsChecked}" Visibility="Visible" VerticalAlignment="Center" HorizontalAlignment="Center" HorizontalContentAlignment="Center"/>
                                            </DataTemplate>
                                        </wpftk:DataGridTemplateColumn.CellTemplate>
                                    </wpftk:DataGridTemplateColumn>
                                    <wpftk:DataGridTextColumn Header="N°" Width="30" Binding="{Binding Id}" IsReadOnly="True" />
                                    <wpftk:DataGridTextColumn Header="CurrentState" Visibility="Hidden" IsReadOnly="True" />
                                    <wpftk:DataGridTextColumn Header="Etat courant" Width="150" Binding="{Binding CurrentState}" IsReadOnly="True" />
                                    <wpftk:DataGridTextColumn Header="Message" Width="*" Binding="{Binding Message}" IsReadOnly="True" />
                                    <wpftk:DataGridTextColumn Header="Temps de changement" Width="130" Binding="{Binding ChangeTime, StringFormat='dd/MM/yyyy hh:MM:ss'}" IsReadOnly="True" />
                                </wpftk:DataGrid.Columns>
                            </wpftk:DataGrid>
    et voici le code permettant de récupérer une cellule en particulier :

    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
     
    public DataGridCell GetCell(int row, int column)
        {
          DataGridRow rowContainer = GetRow(row);
     
          if (rowContainer != null)
          {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
     
            // Try to get the cell but it may possibly be virtualized.
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            {
              // Now try to bring into view and retreive the cell.
              m_DataGrid.ScrollIntoView(rowContainer, m_DataGrid.Columns[column]);
              cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
          }
          return null;
        }
     
        public DataGridRow GetRow(int index)
        {
          DataGridRow row = (DataGridRow)m_DataGrid.ItemContainerGenerator.ContainerFromIndex(index);
          if (row == null)
          {
            // May be virtualized, bring into view and try again.
            m_DataGrid.UpdateLayout();
            m_DataGrid.ScrollIntoView(m_DataGrid.Items[index]);
            row = (DataGridRow)m_DataGrid.ItemContainerGenerator.ContainerFromIndex(index);
          }
          return row;
        }
     
        public static T GetVisualChild<T>(Visual parent) where T : Visual
        {
          T child = default(T);
          int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
          for (int i = 0; i < numVisuals; i++)
          {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
              child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
              break;
            }
          }
          return child;
        }
    Et dans l'événement LoadingRow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetCell(index de Row, 0).Content = ??? (==> ContentPresenter)
    Quelqu'un aurait une idée ?

    D'avance merci à tous.

  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
    Par défaut
    Salut,

    As-tu essayer de voir ce que ça pouvait donner avec le type de colonne prévu à cet effet : DataGridCheckBoxColumn.

    Sinon peut-être qu'il faut envisager une autre manière de faire. Le binding TwoWay et le travail à partir de l'enregistrement ne pourrait pas faire l'affaire ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Bonjour,

    Non je n'ai pas essayé avec une DataGridCheckBoxColumn mais plus tard j'aurai besoin de boutons et images dans mon DataGrid donc je me dis que de toutes façons je devrai régler ce problème.

    Par contre qu'est-ce que c'est que le binding "Two way" ? Aurais-tu un exemple ?

    Un tout grand merci.

  4. #4
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Bonjour,

    Deux questions :

    Le problème, c'est que comme contenu de cellule je ne peux récupérer qu'un ContentPresenter qui ne m'aide pas du tout, puisque son contenu à lui (.Content) n'est pas une CheckBox mais un DataRowView. Donc pas moyen de récupérer la checkbox telle quelle.
    - En quoi est-ce génant ? Ne peux-tu pas récupérer le contenu à partir de la DataRowView et du numéro de colonne de ta checkbox ?

    Pour tenter de récupérer la checkbox de chaque enregistrement
    - Que veux tu dire par là? Tu veux savoir si la checkbox est cochée ou décochée? "Capturer" le moment où un "cochage/décochage" est effectué?

    Si tel est le cas, peut-être devrais-tu utiliser une Commande. Sinon je pense qu'une DataGridCheckBoxColumn peut également être un bon choix.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Par défaut
    Bonjour,

    Après quelques recherches pas moyen de récupérer la CheckBox à partir de la DataRowView renvoyée.

    Par contre, pour récupérer le contenu du ContentPresenter en question (qui représente en fait le contenu d'une cellule), il faut utiliser la méthode LoadContent() du ContentPresenter. Cette méthode renvoie un DependencyObject qui peut par la suite être casté en CheckBox.

    Donc la solution est là.

    Mais malgré tout, après quelques tests, si la colonne qui contient la CheckBox n'est pas "bindée", alors à chaque fois que le Layout du DataGrid est mis à jour, les CheckBox sont décochées automatiquement. Autrement dit, si on scrolle dans la grille, les cases se décochent toutes seules...

    La seule solution est effectivement d'utiliser le mode TwoWay avec un binding sur un champ de la table associée au DataGrid (champ "IsSelected" par exemple). Avec ça, plus aucun problème.

    Encore merci à tous.

Discussions similaires

  1. Pb de layout:checkbox dans un datagrid
    Par dahmen dans le forum Struts 1
    Réponses: 4
    Dernier message: 02/04/2007, 14h17
  2. Réponses: 5
    Dernier message: 30/03/2007, 20h54
  3. Réponses: 2
    Dernier message: 19/05/2006, 18h01
  4. [C#] checkbox dans un datagrid
    Par aymron dans le forum ASP.NET
    Réponses: 4
    Dernier message: 02/02/2006, 17h32
  5. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44

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