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 :

Combobox sur edit d'une cellule de DataGrid


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Combobox sur edit d'une cellule de DataGrid
    Salut à toutes et à tous,

    Soit un DataGrid lié à un CollectionView.

    Une des colonnes (colonne PCode) doit être éditable, mais on ne peut pas y mettre n'importe quoi. Il faut saisir une donnée présente dans une autre datatable. Je veux donc mettre un combobox sur le edit de la cellule. Mon problème est que je n'arrive pas à ramener les données de la datatable. Malgré mes différentes recherches et essais, ma colonne change bien pour une combobx en mode édition, mais la combobox reste désespérément vide.

    Voici la partie xaml de mon datagrid
    Code xaml : 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
                <DataGrid x:Name="MdbPointsDataGrid" Margin="15,312,103,15" Drop="OnDrop" SelectionChanged="MdbPointsDataGrid_SelectionChanged" ItemsSource="{Binding}"  AutoGenerateColumns="False">                <DataGrid.Columns>
                        <DataGridTextColumn Header="Numéro" Binding="{Binding Numero}" IsReadOnly="True" />
                        <DataGridTemplateColumn Header="PCode">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding PCode}" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <ComboBox x:Name="PCodesCombobox" SelectedItem="{Binding PCode}" ItemsSource="{Binding PCodesCV}"  DisplayMemberPath="pcode_description" SelectedValuePath="num_pcode" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellEditingTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="X" Binding="{Binding X}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Y" Binding="{Binding Y}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Z" Binding="{Binding Z}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Nom complet" Binding="{Binding Nom}" IsReadOnly="True" />
                    </DataGrid.Columns>
                    <DataGrid.Resources>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding PCode}" Value="50">
                                    <Setter Property="Background" Value="Red"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.Resources>
                </DataGrid>

    PCodesCV est un CollectionView qui retourne les données triées de la datatable, et j'ai vérifié qu'il contienne bien les données.

    Où est mon erreur ?
    Comment dois-je faire ?

    Merci de vos z'avis z'avisés.
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Ton problème vient surement du binding de ItemsSource de la combobox.
    Ici il va rechercher les infos dans DataGrid.ItemsSource[x].PCodesCV

    Il faut utiliser un Bindingproxy. Voici un petit exemple
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    J'ai beau essayer depuis ce matin, je n'y arrive pas.

    J'ai bien entendu essayé le lien dont tu m'as parlé, mais le résultat est resté le même.

    Si je crée le combobx suivant à l'extérieur de ma datagrid, il me donne les bonnes valeurs :

    Code xaml : 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
                <ComboBox x:Name="terrain_pcodeComboBox" DisplayMemberPath="pcode_description" ItemsSource="{Binding}" Margin="211,220,113,260" SelectedValuePath="num_pcode">
                    <ComboBox.ItemContainerStyle>
                        <Style TargetType="ComboBoxItem">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <Grid Height="20" Width="Auto" ShowGridLines="False">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="25"/>
                                                <ColumnDefinition Width="10"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock Grid.Column="0" Text="{Binding num_pcode}" TextAlignment="Right"/>
                                            <TextBlock Grid.Column="1" Text="-" TextAlignment="Center"/>
                                            <TextBlock Grid.Column="2" Text="{Binding pcode_description}" TextAlignment="Left"/>
                                        </Grid>
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ComboBox.ItemContainerStyle>
                </ComboBox>

    Si je copie la combobox dans le datagrid comme ceci, il reste vide :
    Code xaml : 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
                <DataGrid x:Name="MdbPointsDataGrid" Margin="15,312,103,15" Drop="OnDrop" SelectionChanged="MdbPointsDataGrid_SelectionChanged" ItemsSource="{Binding}"  AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Numéro" Binding="{Binding Numero}" IsReadOnly="True" />
                        <DataGridTemplateColumn Header="PCode">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding PCode}" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <ComboBox x:Name="pcodeComboBox" DisplayMemberPath="pcode_description" ItemsSource="{Binding}" Margin="0,0,0,0" SelectedValuePath="num_pcode">
                                        <ComboBox.ItemContainerStyle>
                                            <Style TargetType="ComboBoxItem">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <Grid Height="20" Width="Auto" ShowGridLines="False">
                                                                <Grid.ColumnDefinitions>
                                                                    <ColumnDefinition Width="25"/>
                                                                    <ColumnDefinition Width="10"/>
                                                                    <ColumnDefinition Width="*"/>
                                                                </Grid.ColumnDefinitions>
                                                                <TextBlock Grid.Column="0" Text="{Binding num_pcode}" TextAlignment="Right"/>
                                                                <TextBlock Grid.Column="1" Text="-" TextAlignment="Center"/>
                                                                <TextBlock Grid.Column="2" Text="{Binding pcode_description}" TextAlignment="Left"/>
                                                            </Grid>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </Style>
                                        </ComboBox.ItemContainerStyle>
                                    </ComboBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellEditingTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="X" Binding="{Binding X}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Y" Binding="{Binding Y}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Z" Binding="{Binding Z}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Nom complet" Binding="{Binding Nom}" IsReadOnly="True" />
                    </DataGrid.Columns>
                    <DataGrid.Resources>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding PCode}" Value="50">
                                    <Setter Property="Background" Value="Red"/>
                                </DataTrigger>
     
     
                                <DataTrigger Binding="{Binding Status}" Value="3">
                                    <Setter Property="Background" Value="Red"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.Resources>
                </DataGrid>

    Le datagrid et le combobx extérieur (celui qui fonctionne) sont tous les 2 dans un
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
            <Grid DataContext="{StaticResource terrain_pcodeViewSource}">
    avec un
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <Window.Resources>
            <local:PostGreSQLDataSet x:Key="postGreSQLDataSet"/>
            <CollectionViewSource x:Key="terrain_pcodeViewSource" Source="{Binding terrain_pcode, Source={StaticResource postGreSQLDataSet}}"/>
        </Window.Resources>
    Je ne comprend vraiment pas ce qui n'est pas bon.
    Je comprend bien ce que tu expliques par
    Ton problème vient surement du binding de ItemsSource de la combobox.
    Ici il va rechercher les infos dans DataGrid.ItemsSource[x].PCodesCV
    mais je n'arrive pas à résoudre mon problème.

    Comment dois-je faire ?

    Merci,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Après une journée complète juste sur ce problème, j'ai avancé un peu.

    J'arrive enfin à lier mes données ma combobox. Toutefois, lorsque la cellule se met en mode édition, ma combobox écrit "System.Data.DataRowView" au lieu de mettre la valeur actuelle, bien que celle-ci soit sélectionnée lors du développement de la combobox.

    Je pense que le problème vient du SelectedItem="{Binding Path=PCode}". Je pense cela parce que l'item du combobox n'est pas le même que l'item de la ligne de la datagrid. Je pense que je devrais avoir qqch comme (en mode verbeux ...) SelectedItem= item de la combobox dont le nopcode = le PCode du {Binding Path=PCode}. Mais comme je dis, je pense, je ne suis pas certain.

    Comment dois-je faire ?

    Voici la version actuelle de la datagrid :
    Code xaml : 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
    <DataGrid x:Name="MdbPointsDataGrid" Margin="15,312,103,15" Drop="OnDrop" SelectionChanged="MdbPointsDataGrid_SelectionChanged" ItemsSource="{Binding}"  AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" RowDetailsVisibilityMode="Visible">                <DataGrid.Columns>
                        <DataGridTextColumn Header="Numéro" Binding="{Binding Numero}" IsReadOnly="True" />
     
                        <DataGridTemplateColumn Header="PCode">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding PCode}" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <ComboBox ItemsSource="{Binding terrain_pcode, Source={StaticResource postGreSQLDataSet}}" SelectedValuePath="nopcode" SelectedValue="{Binding Path=PCode}" SelectedItem="{Binding Path=PCode}" IsDropDownOpen="True">
                                        <ComboBox.ItemContainerStyle>
                                            <Style TargetType="ComboBoxItem">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <DataTemplate>
                                                            <Grid Height="20" Width="Auto" ShowGridLines="False">
                                                                <Grid.ColumnDefinitions>
                                                                    <ColumnDefinition Width="25"/>
                                                                    <ColumnDefinition Width="10"/>
                                                                    <ColumnDefinition Width="*"/>
                                                                </Grid.ColumnDefinitions>
                                                                <TextBlock Grid.Column="0" Text="{Binding nopcode}" TextAlignment="Right"/>
                                                                <TextBlock Grid.Column="1" Text="-" TextAlignment="Center"/>
                                                                <TextBlock Grid.Column="2" Text="{Binding pcode_description}" TextAlignment="Left"/>
                                                            </Grid>
                                                        </DataTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </Style>
                                        </ComboBox.ItemContainerStyle>
                                    </ComboBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellEditingTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="X" Binding="{Binding X}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Y" Binding="{Binding Y}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Z" Binding="{Binding Z}" IsReadOnly="True" />
                        <DataGridTextColumn Header="Nom complet" Binding="{Binding Nom}" IsReadOnly="True" />
                    </DataGrid.Columns>
                    <DataGrid.Resources>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding PCode}" Value="50">
                                    <Setter Property="Background" Value="Red"/>
                                </DataTrigger>
     
     
                                <DataTrigger Binding="{Binding Status}" Value="3">
                                    <Setter Property="Background" Value="Red"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.Resources>
                </DataGrid>

    Merci de votre aide,
    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Je n'ai malheureusement rien compris au message de DouglasDR. J'ai par contre supprimé la partie SelectedItem="{Binding Path=PCode}" vu qu'il y a déjà un SelectectedValuePath et un SelectedValue. Le problèmes reste cependant le même. Je ne comprend pas du tout pourquoi, lorsque la cellule se met en mode édition, la combobox écrit "System.Data.DataRowView", que la valeur du PCode soit dans la liste ou pas.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  6. #6
    Membre éprouvé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 410
    Points : 1 243
    Points
    1 243
    Par défaut
    Salut Jean Marc,
    je ne peux malheureusement pas t'aider pour ton problème de Binding.

    Par contre, le message de Douglas est un spam
    Désolé.
    A+
    Salut à tous et merci @# yoyo3d

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci yoyo3b. Ça m'était tout à fait incompréhensible, de toute manière, mais merci de l'avertissement.

    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  8. #8
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Points : 331
    Points
    331
    Par défaut
    L'ItemsSource de ta ComboBox est Binder sur les donnée de la ligne ...
    Soit il te faut dans chacun de ces Objets une Propriété de type List, ObservableCollection, ... que tu pourra Binder comme ItemsSource de ta ComboBox, mais la tes Objets sont des DataRow (si je t'ai bien suivi) tu seras donc obliger de créer une classe intermédiaire.

    Soit plus judicieux tu te crée un ViewModel dans le quels tu as ta CollectionView Binder à ta DataGrid et une autre CollectionView , l'ItemsSource de ta ComboBox. Dans ce cas utilise plutôt une DataGridComboBoxColumn elle est prévue pour sa, si tu veut absolument utiliser une DataTemplateColumn et une ComboBox tu risque d'avoir des problème pour accéder au DataContext de la DataGrid dans le DataTemplate de la colonne , un coup d’œil ici t'aideras pas mal : http://www.thomaslevesque.fr/tag/freezable/

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Je vais aller faire un petit tour sur le lien que tu me donnes.

    C'est intéressant d'apprendre. Merci aussi pour les infos sur les ViewModels etc.
    Pour finir j'ai remplacé la combobox par un listbox, mais justement ça m'intéresse d'apprendre.

    Merci champsy_dev
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/07/2009, 22h18
  2. utiliser un keypress sur une cellule de datagrid
    Par thor76160 dans le forum C#
    Réponses: 24
    Dernier message: 27/04/2009, 10h24
  3. Réponses: 4
    Dernier message: 05/03/2007, 14h53
  4. [C#] contrôle affichable dans une cellule de datagrid
    Par grome dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/04/2006, 16h22
  5. Edition d'une cellule d'un JTable
    Par teuteu62 dans le forum Composants
    Réponses: 3
    Dernier message: 05/01/2006, 15h16

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