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

C# Discussion :

WPF datagrid avec ligne de détail contenant un autre datagrid


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Par défaut WPF datagrid avec ligne de détail contenant un autre datagrid
    Bonjour,

    J'essaye de rajouter un datagrid dans une ligne de détail d'un autre datagrid.

    Cependant, je n'ai aucune ligne de détail qui s'affiche.

    Voici mon code xaml :

    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
                        <DataGrid IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" Name="DgAgent">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="agentId" Binding="{Binding agentId}" Width="*"/>
                                <DataGridTextColumn Header="pid" Binding="{Binding pid}" Width="*"/>
                                <DataGridTextColumn Header="Etat" Binding="{Binding state}" Width="*"/>
                            </DataGrid.Columns>
                            <DataGrid.RowDetailsTemplate>
                                <DataTemplate>
                                    <DataGrid IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding agentSessions.AgentSession}">
                                        <DataGrid.Columns>
                                            <DataGridTextColumn Header="SessionId" Binding="{Binding SessionId}" Width="*"/>
                                            <DataGridTextColumn Header="SessionState" Binding="{Binding SessionState}" Width="*"/>
                                            <DataGridTextColumn Header="StartTime" Binding="{Binding StartTime}" Width="*"/>
                                            <DataGridTextColumn Header="EndTime" Binding="{Binding EndTime}" Width="*"/>
                                            <DataGridTextColumn Header="ThreadId" Binding="{Binding ThreadId}" Width="*"/>
                                            <DataGridTextColumn Header="ConnectionId" Binding="{Binding ConnectionId}" Width="*"/>
                                            <DataGridTextColumn Header="SessionExternalState" Binding="{Binding SessionExternalState}" Width="*"/>
                                            <DataGridTextColumn Header="SessionMemory" Binding="{Binding SessionMemory}" Width="*"/>                                        
                                        </DataGrid.Columns>
                                    </DataGrid>
                                </DataTemplate>
                            </DataGrid.RowDetailsTemplate>
                        </DataGrid>

    Code de la data source du datagrid principal :
    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
    class Agents
        {
            public List<Agent> agents { get; set; }
        }
     
    class Agent
        {
            public string agentId { get; set; }
            public string pid { get; set; }
            public string state { get; set; }
            public AgentSessions agentSessions { get; set; }
        }
     
    class AgentSessions
        {
            public List<AgentSession> AgentSession { get; set; }
        }
     
    class AgentSession
        {
            public int SessionId { get; set; }
            public string SessionState { get; set; }
            public DateTime StartTime { get; set; }
            public object EndTime { get; set; }
            public int ThreadId { get; set; }
            public object ConnectionId { get; set; }
            public int SessionExternalState { get; set; }
            public int SessionMemory { get; set; }
        }
    Je n'ai pas d'erreur dans le code, aurait-je fait une erreur au niveau du binding ?

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Ton code est à revoir pour le coté List<T> .
    La "liste detail" ne s'affiche qu'à l'execution en cliquant sur la ligne parente.
    code behind.cs data revu:
    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
    public class Agent
        {
            public string AgentId { get; set; }
            public string Pid { get; set; }
            public string State { get; set; }
            public List<Session> ListSessions { get; set; }
            public Agent()
            {
                ListSessions = new List<Session>();
            }
        }
        public class ListAgents:List<Agent> 
        {
            public ListAgents()
            {
                for (int i = 1; i < 6; i++)
                {
                    Agent ag = new Agent() { AgentId = i.ToString(), Pid = "item" + i.ToString() };
                    for (int j = 0; j < 3; j++)
                    {
                        Session ss = new Session() { SessionId=j,SessionState="enabled"};
                        ag.ListSessions.Add(ss);
                    }
                    this.Add(ag);
                }
            }
        }
     
    public class Session
        {
            public int SessionId { get; set; }
            public string SessionState { get; set; }
            public DateTime StartTime { get; set; }
            public object EndTime { get; set; }
            public int ThreadId { get; set; }
            public object ConnectionId { get; set; }
            public int SessionExternalState { get; set; }
            public int SessionMemory { get; set; }
        }
    code xaml du form user (pas de code behind.cs):

    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
    <Window x:Class="WpfDgvDetail.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfDgvDetail"
            Title="MainWindow" Height="350" Width="525">
        <Window.DataContext>
            <local:ListAgents/>
        </Window.DataContext>
        <Grid>
            <DataGrid IsReadOnly="True" AutoGenerateColumns="False"
                      CanUserAddRows="False" Name="DgAgent"
                      ItemsSource="{Binding }">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="AgentId" Binding="{Binding AgentId}" Width="*"/>
                    <DataGridTextColumn Header="Pid" Binding="{Binding Pid}" Width="*"/>
                    <DataGridTextColumn Header="State" Binding="{Binding State}" Width="*"/>
                </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <DataGrid 
                            IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" 
                            ItemsSource="{Binding ListSessions}">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="SessionId" Binding="{Binding SessionId}" Width="*"/>
                                <DataGridTextColumn Header="SessionState" Binding="{Binding SessionState}" Width="*"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>
        </Grid>
    </Window>

    bon code....

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Malheureusement je ne peux pas toucher à mes classes, car elle me servent à transformer un JSON reçu d'une API.
    Je préfère votre structure mais elle ne correspond pas au JSON reçu.

    Pensez-vous que le problème vienne de la structure ? et que je sois obligé d'en créer une nouvelle juste pour remplir mon datagrid ?

    EDIT : j'ai créé, pour essayer, une classe avec une liste directement, et ça ne change rien, je n'ai pas le détail de chaque ligne (alors qu'il y a bien des données dans la liste)
    Même avec ton code pour les classes, je n'ai pas de ligne de détail. Donc les "Sessions" n'apparaissent pas

    EDIT 2 : Résolu !
    Il manquait juste le RowDetailsVisibilityMode="Visible" dans le datagrid principal.

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

Discussions similaires

  1. [WPF] Insérer des lignes dans un DataGrid
    Par VBcodeur dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/03/2016, 09h31
  2. Réponses: 6
    Dernier message: 08/12/2015, 13h47
  3. Réponses: 0
    Dernier message: 10/09/2014, 14h23
  4. Réponses: 1
    Dernier message: 11/03/2014, 09h50
  5. [Dojo] Datagrid avec lignes masquées ou mmontrées selon un évènement
    Par elmarco06 dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 05/02/2010, 14h48

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