none
WPF DataGrid dans une DataGrid RRS feed

  • Question

  • Bonjour, 

    Je viens vous poser une question.

    Voici ce que je voudrais faire, je dois faire une DataGrid qui reprend différentes informations. Lorsque je sélectionne une ligne (une ligne correspond à une commande), les détails de cette ligne apparaissent (les détails correspondent à l'historique de la commande). 

    C'est pour l'affichage de l'historique que ça bloque, je voudrais afficher ces détails dans une DataGrid. Bien sur pour chaque commande, l'historique est différent.

    Comment faire pour ajouter une DataGrid dans les détails d'une autre DataGrid et comment effectuer le Binding de celle-ci?

    Merci de votre aide.


    dimanche 13 octobre 2013 20:44

Réponses

  • Bonjour,

    OK, voilà la solution (qui n'est pas très propre car elle ne respecte pas le standard MVVM mais qui marche) :

    On considère vos objets suivants :

    public class Commande
    {
        public string Numéro
        {
            get;
            set;
        }
    
        public ObservableCollection<CommandeDetail> Detail
        {
            get;
            set;
        }
    }
    
    public class CommandeDetail
    {
        public string Désignation
        {
            get;
            set;
        }
    }

    On a la fenêtre MainWindow suivante :

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                this.DataContext = this;
                this.Commandes = new ObservableCollection<Commande>();
                this.Commandes.Add(new Commande()
                {
                    Numéro = "1",
                    Detail = new ObservableCollection<CommandeDetail>()
                    {
                        new CommandeDetail() { Désignation = "Désignation 1"},
                        new CommandeDetail() { Désignation = "Désignation 2"}
                    }
                });
    
                this.Commandes.Add(new Commande()
                {
                    Numéro = "2",
                    Detail = new ObservableCollection<CommandeDetail>()
                    {
                        new CommandeDetail() { Désignation = "Désignation 3"},
                        new CommandeDetail() { Désignation = "Désignation 4"}
                    }
                });
    
                InitializeComponent();
            }
    
            public ObservableCollection<Commande> Commandes
            {
                get;
                set;
            }
    
        }

    Et voilà le XAML de cette fenêtre :

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid HorizontalAlignment="Left" Margin="94,32,0,0" VerticalAlignment="Top" Height="128" Width="316" ItemsSource="{Binding Commandes}" x:Name="commandes">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Numéro}" />
                </DataGrid.Columns>
            </DataGrid>
            <DataGrid HorizontalAlignment="Left" Margin="94,181,0,0" VerticalAlignment="Top" Height="128" Width="316" ItemsSource="{Binding Path=SelectedItem.Detail, ElementName=commandes}">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Désignation}" />
                </DataGrid.Columns>
            </DataGrid>
    
        </Grid>
    </Window>

    Est-ce que cela répond à votre besoin ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 14 octobre 2013 20:46
    Modérateur

Toutes les réponses

  • Bonjour,

    Avant d'aller plus loin et afin de vous donner un bon exemple, utilisez vous le pattern MVVM ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 14 octobre 2013 00:06
    Modérateur
  • Bonjour, non je n utilise pas le mvvm.
    lundi 14 octobre 2013 05:10
  • Bonjour,

    OK, voilà la solution (qui n'est pas très propre car elle ne respecte pas le standard MVVM mais qui marche) :

    On considère vos objets suivants :

    public class Commande
    {
        public string Numéro
        {
            get;
            set;
        }
    
        public ObservableCollection<CommandeDetail> Detail
        {
            get;
            set;
        }
    }
    
    public class CommandeDetail
    {
        public string Désignation
        {
            get;
            set;
        }
    }

    On a la fenêtre MainWindow suivante :

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                this.DataContext = this;
                this.Commandes = new ObservableCollection<Commande>();
                this.Commandes.Add(new Commande()
                {
                    Numéro = "1",
                    Detail = new ObservableCollection<CommandeDetail>()
                    {
                        new CommandeDetail() { Désignation = "Désignation 1"},
                        new CommandeDetail() { Désignation = "Désignation 2"}
                    }
                });
    
                this.Commandes.Add(new Commande()
                {
                    Numéro = "2",
                    Detail = new ObservableCollection<CommandeDetail>()
                    {
                        new CommandeDetail() { Désignation = "Désignation 3"},
                        new CommandeDetail() { Désignation = "Désignation 4"}
                    }
                });
    
                InitializeComponent();
            }
    
            public ObservableCollection<Commande> Commandes
            {
                get;
                set;
            }
    
        }

    Et voilà le XAML de cette fenêtre :

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid HorizontalAlignment="Left" Margin="94,32,0,0" VerticalAlignment="Top" Height="128" Width="316" ItemsSource="{Binding Commandes}" x:Name="commandes">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Numéro}" />
                </DataGrid.Columns>
            </DataGrid>
            <DataGrid HorizontalAlignment="Left" Margin="94,181,0,0" VerticalAlignment="Top" Height="128" Width="316" ItemsSource="{Binding Path=SelectedItem.Detail, ElementName=commandes}">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Désignation}" />
                </DataGrid.Columns>
            </DataGrid>
    
        </Grid>
    </Window>

    Est-ce que cela répond à votre besoin ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 14 octobre 2013 20:46
    Modérateur
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 21 octobre 2013 07:54