Binding Datagrid

cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023 - 17 juil. 2023 à 20:30
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 - 18 juil. 2023 à 20:27

Bonjour,

Dans une appli, j'ai une liste xFilmDG de type structure. Cette structure est composée de données hétérogénes.

J'essaie de faire un binding de cette liste. Pour les données Opt3 à Opt7 çà fonctionne mais pas pour Opt1 et Opt2 qui sont de type TypParam. Pour celles-ci j'aimerai afficher le .Nom.

J'ai essayé beaucoup de choses mais je n'y arrive pas. Quelqu'un pourrait-il me donner un coup de pouce ?

Merci beaucoup

​  Public Structure TypParam
        Public Id As Integer
        Public Nom As String
  End Structure

  Public Structure StructPropertyVhs
        Public Property Opt1 As TypParam
        Public Property Opt2 As TypParam
        Public Property Opt3 As Integer
        Public Property Opt4 As Integer
        Public Property Opt5 As Boolean
        Public Property Opt6 As Boolean
        Public Property Opt7 As Boolean
        Public Property Opt8 As Boolean
  End Structure

​

​
Public Class FormVisuFilm
    Private xFilmDG As List(Of ClassVehicule.StructPropertyVhs)

    Public Sub New(Film As List(Of ClassVehicule.StructPropertyVhs))

        ' Cet appel est requis par le concepteur.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        xFilmDG = Film
    End Sub


    Private Sub FormVisuFilm_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        ListeVhs.ItemsSource = xFilmDG

        ListeVhs.Columns.Add(New DataGridTextColumn With {.Header = ClassVehicule.NomOption(0), .Binding = New Binding("Opt1")})
        ListeVhs.Columns.Add(New DataGridTextColumn With {.Header = ClassVehicule.NomOption(1), .Binding = New Binding("Opt2")})
        ListeVhs.Columns.Add(New DataGridTextColumn With {.Header = ClassVehicule.NomOption(2), .Binding = New Binding("Opt3")})
        ListeVhs.Columns.Add(New DataGridTextColumn With {.Header = ClassVehicule.NomOption(3), .Binding = New Binding("Opt4")})
        ListeVhs.Columns.Add(New DataGridCheckBoxColumn With {.Header = ClassVehicule.NomOption(4), .Binding = New Binding("Opt5")})
        ListeVhs.Columns.Add(New DataGridCheckBoxColumn With {.Header = ClassVehicule.NomOption(5), .Binding = New Binding("Opt6")})
        ListeVhs.Columns.Add(New DataGridCheckBoxColumn With {.Header = ClassVehicule.NomOption(6), .Binding = New Binding("Opt7")})
        ListeVhs.Columns.Add(New DataGridCheckBoxColumn With {.Header = ClassVehicule.NomOption(7), .Binding = New Binding("Opt8")})


    End Sub
A voir également:

7 réponses

Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 00:28

Bonjour 

  • Pourquoi utiliser une structure plutôt qu'une classe? Les structures sont de type valeur, sauf en cas de nécessité (à savoir à 99,999% dialoguer avec une dll en C ou C++ natif) ça ne fait que consommer de la mémoire pour rien. D'ailleurs, je ne pensais même pas que le binding fonctionne avec des structures.
  • Datagrid ? A ma connaissance il n'y a pas de contrôle de ce nom en winform, et à priori tu es n'es pas en WPF. Donc si comme je le pense, il s'agit d'un Datagridview, tu peux lire ceci https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
18 juil. 2023 à 18:07

Bonjour Whismeril,

Merci pour ta réponse. Je te confirme que je suis bien sous VB.NET WPF. et non pas Winforms.

Ce n'est peut être pas fait dans les régles de l'art en effet. Concernant la différence entre les classes et structures je suis d'accord avec toi. Mais que je sois en classe ou structure çà ne régle pas mon probléme.

Pour OPT1 et Opt2 j'ai un donnée composée et je n'arrive pas à afficher la valeur NOM dans ma data grid.

Concernant la notion de Binding j'ai un peu de mal avec çà. Entre le datacontext, le ItemSource et j'en passe, je ne m'y retrouve pas.


0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 18:20

Appeler tes "window" formQuelqueChose et ne pas préciser que tu es en WPF prête à confusion.

Le binding en wpf est beaucoup plus simple à écrire dans le xaml.

Je tache de te faire un exemple dans la soirée 


0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 18:32

Tu ne m'as pas répondu sur le pourquoi d'une structure plutôt qu'une classe

0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 18:35
0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
18 juil. 2023 à 18:41

La raison d'une structure ? Je n'en ai pas. Je l'ai fait comme çà. Mais pourquoi pas passer en classe oui


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
18 juil. 2023 à 18:47

J'ai eu l'habitude de programmer sous Winforms et j'ai des mauvaises habitudes qui me restent quand je passe à WPF.

L'extrait de programme que j'ai donné était d'abord en Winforms que j'ai converti tant bien que mal en WPF pour pouvoir profiter de certaines capacités graphiques.. C'est pour çà que j'appelle mes fenêtres FORM...


0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 19:39

Premier exemple, sans vue

Le code behind de la window 

    Public Partial Class WdwTestBoumBoum
        Inherits Window
        Public Sub New(ByVal LesFilms As List(Of StructPropertyVhs))
            Me.InitializeComponent()
            DataContext = LesFilms
        End Sub
    End Class

Pour le Xaml, je ne vais pas m'étendre sur le datacontext "transmis" dans l'arborescence des contrôles, je l'ai déjà décrit dans le tuto que je t'ai mis en lien dans le message 5.

Tu verras en commentaire la description de la construction des 3 colonnes d'exemple

<Window x:Class="Test_WPF.WdwTestBoumBoum"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_WPF"
        mc:Ignorable="d"
        Title="WdwTestBoumBoum" Height="450" Width="800"
        DataContext="{Binding}">
    <Grid DataContext="{Binding .}">
        <ListView DataContext="{Binding .}" ItemsSource="{Binding .}">
            <ListView.View>
                <GridView>
                    <!--Une colonne dont le titre est Option 1, la valeur de Opt1.Nom est affichée dans un textblock-->
                    <GridViewColumn Header="Option 1">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Opt1.Nom}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <!--Une colonne dont le titre est Option 2, la valeur de Opt3 est affichée dans un textbox-->
                    <GridViewColumn Header="Option 3">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Opt3}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <!--Une colonne dont le titre est Option 5, la valeur de Opt5 est affichée dans un checkbox-->
                    <GridViewColumn Header="Option 5">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Opt5}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        
    </Grid>
</Window>

Et enfin, le code behind de la fenêtre appelante

            Dim films As List(Of StructPropertyVhs) = New List(Of StructPropertyVhs) From
            {
                New StructPropertyVhs With {
                    .Opt1 = New TypParam With {
                        .Id = 1,
                        .Nom = "Option_Id_1"
                    },
                    .Opt3 = 11,
                    .Opt5 = True
                },
                New StructPropertyVhs With {
                    .Opt1 = New TypParam With {
                        .Id = 2,
                        .Nom = "Option_Id_2"
                    },
                    .Opt3 = 22,
                    .Opt5 = False
                },
                New StructPropertyVhs With {
                    .Opt1 = New TypParam With {
                        .Id = 3,
                        .Nom = "Option_Id_3"
                    },
                    .Opt3 = 33,
                    .Opt5 = True
                }
            }

            Dim test As WdwTestBoumBoum = New WdwTestBoumBoum(films)
            test.Show()

Ce qui donne


0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
18 juil. 2023 à 19:45

À noter cependant,

  • l'utilisation d'une List Of ne permet pas au binding de réactualiser automatiquement la listview si un enregistrement est ajouté (ou supprimé) à la List par ailleurs
  • le fait que TypParam StructPropertyVhs n'implémente pas INotifyPropertyChanged ne permettra pas au binding de mettre à jour un champ qui serait affiché sur 2 contrôles (y compris sur 2 feneêtres différentess) d'être mis à jour automatiquement sur l'un quand il est modifié sur l'autre 
0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656 > Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024
18 juil. 2023 à 19:50

Autre remarque, écrire une vue, serait plus avantageux si tu veux multiplier les contrôles et les enregistrements sur une même fenêtre

0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
18 juil. 2023 à 20:13

3 questions :

- Tu définis le datacontext de la window dans le code behind et ensuite dans le XAML. Pourquoi ?

- Je pensais que le fait de définir le datacontext de la window suffisait pour les contrôles enfant. Héritage.

-Au niveau de la listview tu définis le datacontext et le itemssource. Je pensais que l'un des 2 serait suffisant. Et même je pensais que le fait d'avoir déclaré le datacontext de la window était suffisant (question précédente) .

En tout cas  merci.

Je vais essayer çà . Je pense que j'ai encore beaucoup à apprendre sur le binding.


0
Whismeril Messages postés 19035 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
Modifié le 18 juil. 2023 à 20:28

Ces 3 questions ont leur réponse dans le tuto précédemment cité

0
Rejoignez-nous