none
Insérer des class dans un DataGrid RRS feed

  • Question

  • Bonjour,

    Je peine un peu à insérer des class dans mon DataGrid (je suis en WPF).

    Mes class ressemblent à cela :

    Public Class Entreprise
    {
    public string Siren {get; set;};
    public string Nom {get; set;};
    public string Adresse {get; set;};
    }
    
    Public Class Salarie
    {
    public string Nom {get; set;};
    public string Prenom {get; set;};
    public string Adresse {get; set;};
    }
    
    

    et là c'est le drame, je ne voit pas comment faire. je l'avais fait avec un datagridview mais en WPF c'est du DataGrid.

    j'ai pensé à ça : 

    public void InsererDatagrid(Entreprise ent, Salarie sal)
            {
    	DataGridDSN.Items.Add(ent.Siren, ent.Nom, ent.Adresse, sal.Nom, sal.Prenom, sal.Adresse);
    	}
    Mais comme vous vous en doutez, ça ne passe pas...

    Si vous avez des idées...

    Par avance merci.



    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    jeudi 27 novembre 2014 19:15

Réponses

  • Ce n'est qu'un exemple, mais à vous de personnaliser :

    Les classes :

       public class Entreprise
        {
            public Entreprise()
            {
                Salaries = new List<Salarie>();
            }
    
            public string Siren { get; set; }
            public string Nom { get; set; }
            public string Adresse { get; set; }
            public List<Salarie> Salaries { get; private set; }
        }
    
        public class Salarie
        {
            public string Nom { get; set; }
            public string Prenom { get; set; }
            public string Adresse { get; set; }
        }


    Le XAML de la MainForm :

        <Grid>
            <ListBox x:Name="ListeEntreprise">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Nom}"/>
                        <ListBox ItemsSource="{Binding Salaries}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="200"/>
                                            <ColumnDefinition Width="200"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="{Binding Nom}"/>
                                        <TextBlock Text="{Binding Prenom}" Grid.Column="1"/>
                                        <TextBlock Text="{Binding Adresse}" Grid.Column="2"/>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>


    Et le code de la MainForm :

           public MainWindow()
            {
                InitializeComponent();
                ListeEntreprise.ItemsSource = GetDatas();
            }
    
            public List<Entreprise> GetDatas()
            {
                var entreprises = new List<Entreprise>();
    
                var c2i = new Entreprise
                {
                    Nom = "Clark Ingénierie Informatique",
                    Adresse = "Chez moi",
                    Siren = "0123456"
                };
                c2i.Salaries.Add(new Salarie
                {
                    Adresse = "Chez lui",
                    Nom = "Clark",
                    Prenom = "Richard"
                });
                c2i.Salaries.Add(new Salarie
                {
                    Adresse = "Chez elle",
                    Nom = "Clark",
                    Prenom = "Sabine"
                });
    
                var ms = new Entreprise {Nom = "Microsoft", Adresse = "Redmond", Siren = "258"};
                ms.Salaries.Add(new Salarie{Nom="Gates", Prenom = "Bill", Adresse="Redmond"});
    
                entreprises.Add(c2i);
                entreprises.Add(ms);
    
                return entreprises;
            }



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone


    vendredi 28 novembre 2014 08:25

Toutes les réponses

  • Bonjour,

    Avec un DataGrid (et de façon général avec WPF), il est préférable d'utiliser sa propriété ItemsSource :

    var list = new List<Entreprise>();
    list.AddItem(new Entreprise
         {
             Siren = "blablabla",
             Nom = "Clark Ingénierie Informatique",
             Adresse = "Chez moi"
         });
    
     maGrid.ItemsSource = list;
    Mais je vous conseille de vous pencher sur l'approche MVVM qui, même si elle semble plus difficile au début, est en réalité beaucoup plus simple par la suite.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 06:28
  • Bonjour,

    Merci pour votre aide.

    Cependant, dans votre exemple, je ne peux mettre qu'une seule class dans la liste. 

    Dans mon DataGrid, je dois avoir un tableau de la forme :

    12345	Mon Entreprise	36 rue Par ici	Martin Pierre	Adresse1
    12345	Mon Entreprise	36 rue Par ici	Dupont Jean	Adresse2
    12345	Mon Entreprise	36 rue Par ici	Marcel François	Adresse3


    Je regarderai la méthode MVVM qui a visiblement besoin d'un petit apprentissage pour aide utilisé.


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF



    vendredi 28 novembre 2014 08:07
  • Dans ce cas là, c'est une grille avec une sous grille.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 08:10
  • une sous grille ? je ne vois pas ou vous voulez en venir...

    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 08:13
  • 2mn, je vous fais un exemple ;-)

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 08:14
  • super merci beaucoup !

    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 08:14
  • Ce n'est qu'un exemple, mais à vous de personnaliser :

    Les classes :

       public class Entreprise
        {
            public Entreprise()
            {
                Salaries = new List<Salarie>();
            }
    
            public string Siren { get; set; }
            public string Nom { get; set; }
            public string Adresse { get; set; }
            public List<Salarie> Salaries { get; private set; }
        }
    
        public class Salarie
        {
            public string Nom { get; set; }
            public string Prenom { get; set; }
            public string Adresse { get; set; }
        }


    Le XAML de la MainForm :

        <Grid>
            <ListBox x:Name="ListeEntreprise">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Nom}"/>
                        <ListBox ItemsSource="{Binding Salaries}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="200"/>
                                            <ColumnDefinition Width="200"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="{Binding Nom}"/>
                                        <TextBlock Text="{Binding Prenom}" Grid.Column="1"/>
                                        <TextBlock Text="{Binding Adresse}" Grid.Column="2"/>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>


    Et le code de la MainForm :

           public MainWindow()
            {
                InitializeComponent();
                ListeEntreprise.ItemsSource = GetDatas();
            }
    
            public List<Entreprise> GetDatas()
            {
                var entreprises = new List<Entreprise>();
    
                var c2i = new Entreprise
                {
                    Nom = "Clark Ingénierie Informatique",
                    Adresse = "Chez moi",
                    Siren = "0123456"
                };
                c2i.Salaries.Add(new Salarie
                {
                    Adresse = "Chez lui",
                    Nom = "Clark",
                    Prenom = "Richard"
                });
                c2i.Salaries.Add(new Salarie
                {
                    Adresse = "Chez elle",
                    Nom = "Clark",
                    Prenom = "Sabine"
                });
    
                var ms = new Entreprise {Nom = "Microsoft", Adresse = "Redmond", Siren = "258"};
                ms.Salaries.Add(new Salarie{Nom="Gates", Prenom = "Bill", Adresse="Redmond"});
    
                entreprises.Add(c2i);
                entreprises.Add(ms);
    
                return entreprises;
            }



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone


    vendredi 28 novembre 2014 08:25
  • Merci beaucoup pour cet exemple. je vais etudier cela de près et je vous dis ce qu'il en est dans la journée.

    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 08:27
  • Par contre, il n'y a plus de DataGrid dans votre exemple...

    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 08:28
  • Oui et alors ? ;-)

    Avec WPF, le DataGrid ne sert pas vraiment. Je préfère le ListView


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 08:29
  • je ne l'avais pas envisagé...

    pour info, je vais avoir beaucoup de lignes dans mon traitement et beaucoup de colonnes.

    chaque salariés aura en debut de ligne les info de sa société.


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF


    vendredi 28 novembre 2014 08:30
  • Pour une raison que j'ignore encore, la liste ne se remplie dans mon projet mais ça fonctionne correctement dans un projet de test.

    Par contre il y a un bémol dans votre solution. On ne peut pas modifier les données dans la liste. 

    L'idée du Datagrid est pas mal pour cela. 

    Pour vous donner une idée de comment se remplissait mon DataGridView en C# :

    private void datagrids_sans_info(Entreprise ent, Salarie sal)
            {
                dataGridView1.Rows.Add(ent.getSiren(), ent.getSiren(), ent.getRaison(), ent.getNic(), ent.getcompl(),
                ent.getextension(), ent.getdistribution(), ent.getCP(), ent.getLoc(),
                sal.getsecu(), sal.getnom(),
                sal.GetPrenom(), sal.Getmarital(), sal.Getcivilit(), sal.Getcomploc(), sal.Getextension(),
                sal.Getdistrib(), sal.GetCP(), sal.GetLocalite());
    

    Je pensais que j'aurai pu faire la même chose à peu près avec un DataGrid (j'ai supprimé beaucoup de colonne dans mon exemple mais sinon y'en a une centaine)


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 10:41
  • Sisi, tout marche bien dans ma solution ;-) faut juste faire quelques modifs pour que les données soient éditables :

    1. Les classes Entreprises & co doivent implémenter l'interface INotifyPropertyChanged.
    2. Au lieu d'avoir un TextBlock dans le DataTemplate, vous mettez un TextBox.

    Et en faisant cela, quand vous modifiez les données dans les textbox, les données des classes correspondant se mettent à jour automatiquement, comme par magie.

    Je vous invite fortement à vous pencher sur l'approche MVVM.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 10:45
  • Je vais regarder cela de près en effet. 

    je n'avais pas de soucis en C# mais en WPF, c'est une autre histoire, surtout quand on se forme tout seul :)


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 10:47
  • WPF c'est :

    1. On fait des trucs super compliqué en quelques secondes,
    2. On fait des trucs super simple en plusieurs semaines.

    Si vous voulez que 1 soit plus important que 2 : MVVM ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 10:54
  • Je comprends :)

    j'ai trouvé une bonne doc sur MVVM chez nos amis de Developpez.com mais avez vous des sites ou des livres à me conseillez ? en Français si possible.

    En attendant, il faut que j'arrive a remplir ma fenêtre et je vais y arriver!!


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 10:57
  • J'aime pas Developpez.com.

    Mais ceci dit, les livres de chez ENI sont gratuits aujourd'hui. Il y en a sur MVVM qui sont pas mal. Allez-y vite car l'offre de ENI n'est pas éternelle.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 11:01
  • en fait j'ai deja le livre WPF de ENI dans lequel ils en parlent mais il faudrait que je relise entierement le chapitre je pense.

    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    vendredi 28 novembre 2014 11:16
  • Bonjour,

    j'ai pu avancer un peu sur mon problème qui semble résolu. 

    au final, j'ai gardé mon datagrid et j'ai pu mettre mes deux class dedans. 

    Voila comment j'ai fait :

    Public Class Entreprise
    {
    public string Siren {get; set;};
    public string Nom {get; set;};
    public string Adresse {get; set;};
    }
    
    Public Class Salarie
    {
    public string Nom {get; set;};
    public string Prenom {get; set;};
    public string Adresse {get; set;};
    }
    
    private ObservableCollection<LigneAEcrire> listEnt = new ObservableCollection<LigneAEcrire>();
    
            public class LigneAEcrire
            {
                public string siren { get; set; }
                public string raison { get; set; }
                public string Nom { get; set; }
                public string Prenom { get; set; }
            }
    
    listEnt.Add(new LigneAEcrire
                        {
                            siren = Entreprise.Siren,
                            raison = Entreprise.Raison,
                            Nom = Salarie.Nom,
                            Prenom = Salarie.Prenom
    
                        });
    
                        DataGridDSN.ItemsSource = listEnt;

    j'ai utilisé un ObservableCollection à la place d'une List car ça ne fonctionnait pas sans cela.

    Par contre, j'avoue que j'ai trouvé la solution du ObservableCollection sur le net mais je n'ai pas bien compris comment ça fonctionne par rapport à la List.


    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    lundi 1 décembre 2014 20:46