回答済み DataGrid in Datagrid dynamisch bei Abruf aufbauen

  • Donnerstag, 13. September 2012 07:40
     
     

    für eine Anwendung wollen wir folgende Darstellung verwenden

    1ter Screen

       Kd-Nr   Name       Ort                    
    >  1       Firma A    München
    >  2       Firma B    Stuttgart
    >  3       Firma C    Frankfurt
    >  4       Firma D    Hamburg

    Durch Mausklick aus den " > " soll die jeweilige Zeile ausgeklappt werden



    2ter Screen

       Kd-Nr   Name       Ort                   
    >  1       Firma A    München
    v  2       Firma B    Stuttgart
         Idx   Anred  Vorname    Nachname
       >  1    Herr   Hans       Muster    
       >  2    Frau   Ilse        Wilse
       >  3    Herr   Otto       Motto
    v  3       Firma C    Frankfurt
         Idx   Anred  Vorname    Nachname
       >  1    Herr   Peter      Mayer    
       >  2    Frau   Anna       Kanne
    >  4       Firma D    Hamburg

    Es sollen mehrere Zeilen aufgeklappt werden können. Die Spalten des Sub-Datagrid's weichen total vom ersten Datengrid ab und sollen erst beim Aufklappen geladen werden. Immer wenn ein " > " angeboten wird, kann man ein Sub-Datagrid weiter aufklappen.



    3ter Screen

       Kd-Nr   Name       Ort             
    >  1       Firma A    München
    v  2       Firma B    Stuttgart
         Idx   Anred  Vorname    Nachname
       >  1    Herr   Hans       Muster    
       v  2    Frau   Ilse       Wilse
             Datum     Art    Inhalt                 
         >   01.08.12  Tel    Reklamation
         >   05.08.12  Brief  Rücksendeunterlagen
         >   10.08.12  Ware   Retoursendung
         >   15.08.12  Fax    Gutschrift
       >  3    Herr   Otto       Motto
    >  3       Firma C    Frankfurt
    >  4       Firma D    Hamburg


    Das ganze soll dynamisch sein, d.h. erst bei Aufklappen sollen die Daten gebunden werden. 

    Folgende Konstellationen sind denkbar:
    a) das gleiche Datagrid wird in unterschiedlichen Ebenen gezogen, z.B. die Vorgänge auf Stufe 2 unterhalb  der Adresse und auf Stufe 3 unterhalb der Person
    b) ein Aufklappen erzeugt 2 weitere DataGrid's, z.B. man klappt die Adresse auf und bekommt alle Personen und alle Vorgänge.
    c) ein Aufklappen erzeugt nicht nur Datagrid's sondern zeigt in Label's/Textboxen weitere Details wie Straße, Tel-Nr usw.

    Frage:
    1) Kann man so was sinnvoll über Datagrid's lösen und wie ist der Lösungsansatz ?
    2) Sollte man externe Tool's für so was verwenden, wenn ja, welche ?
    3) Evtl. ist der Gedankenansatz gar falsch und man sollte einen anderen Weg gehen um ein solche Info-Zentrale zu implementieren. Es sollen mehrere IZ für "Adressen, Produkte, Vorgänge, Marketing" realisiert werden.
    4) Hat jemand etwas ähnliches schon umgesetzt und kann uns unterstützen?

    Viele Grüße Edgar

Alle Antworten

  • Donnerstag, 13. September 2012 08:01
     
     

    Hi Edgar,

    ich denke das wird man mit Grouping und Datatemplets (ein bisschen nach unten Scrollen) umsetzen können.

    Das Binden kann man auch direkt machen, es macht eigentlich nur dann einen Unterschied wenn ich die Daten erst lade wenn sie angezeigt werden.

    MFG

    Björn

  • Montag, 24. September 2012 16:32
    Besitzer
     
     

    Hallo Edgar Wenisch,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

  • Dienstag, 25. September 2012 06:31
     
     

    Hallo Robert,

    ich habe mal den Link von Palin gegoogelt, bin aber nicht so recht weiter gekommen.

    Es liegt hauptsächlich darin, dass ich noch recht neu in C#/WPF bin und in meiner bisherigen Umgebung i5/RPG eine ganz andere Ansatzweise herrscht.

    Ich stelle mir ein Lösung vor, wo ein Datagrid gefüllt ist und auf einen Button-Event das Programm per Code für eine DataGrid-Row als Details eine weitere DataGrid nachlädt. In dieser neuen Unter-DataGrid wäre das gleiche Spiel wieder möglich.

    Nachdem ich in dieser Richtung NULL-Erfahrung habe, wäre natürlich ein Code-Snippet sehr hilfreich.

    Gruß Edgar

  • Dienstag, 25. September 2012 08:28
     
     Beantwortet
    Hi Edgar,
    hier mal eine Demo mit RowsDetailsTemplate. Beim Anklicken einer Zeile wird eine Detailansicht der untergeordneten Liste als Tabelle angezeigt. Die Demo ist für eine 3-stufige Hierarchie aufgebaut und kann analog beliebig erweitert werden.
    <Window x:Class="Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window3" Height="300" Width="300"
            xmlns:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <local:ViewModel3 x:Key="vm"/>
         <DataTemplate x:Key="temp2">
          <DataGrid Name="dg3" ItemsSource="{Binding SubItems}" AutoGenerateColumns="false" IsReadOnly="true">
            <DataGrid.Columns>
              <DataGridTextColumn Header="Grandchild-ID" Binding="{Binding ID3}"/>
              <DataGridTextColumn Header="Grandchild-Text" Binding="{Binding Text3}"/>
            </DataGrid.Columns>
          </DataGrid>
        </DataTemplate> 
        <DataTemplate x:Key="temp1">
          <DataGrid Name="dg2" ItemsSource="{Binding SubItems}" AutoGenerateColumns="false"
                    RowDetailsTemplate="{StaticResource temp2}" IsReadOnly="true">
            <DataGrid.Columns>
              <DataGridTextColumn Header="Child-ID" Binding="{Binding ID2}"/>
              <DataGridTextColumn Header="Child-Text" Binding="{Binding Text2}"/>
            </DataGrid.Columns>
          </DataGrid>
        </DataTemplate>
      </Window.Resources>
      <Grid DataContext="{Binding Source={StaticResource vm}}">
        <DataGrid Name="dg1" ItemsSource="{Binding View}" AutoGenerateColumns="false"
                  RowDetailsTemplate="{StaticResource temp1}" IsReadOnly="True">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID1}"/>
            <DataGridTextColumn Header="Text" Binding="{Binding Text1}"/>
          </DataGrid.Columns>
        </DataGrid>
      </Grid>
    </Window>
    

    Dazu der ViewModel:

    Public Class ViewModel3
    
      Private cvs As New CollectionViewSource
      Public ReadOnly Property View As ICollectionView
        Get
          If cvs.View Is Nothing Then cvs.Source = GetData
          Return cvs.View
        End Get
      End Property
    
      Private Function GetData() As ObservableCollection(Of C1)
        Dim col As New ObservableCollection(Of C1)
        For i = 0 To 9
          Dim item1 As New C1 With {.ID1 = i + 1, .Text1 = String.Format("Master {0}", i + 1)}
          col.Add(item1)
          For k = 0 To 3
            Dim item2 As New C2 With {.ID2 = i * 10 + k + 1, _
                                      .Text2 = String.Format("Child {0}", i * 10 + k + 1)}
            item1.SubItems.Add(item2)
            For l = 0 To 3
              Dim item3 As New C3 With {.ID3 = i * 100 + k * 10 + l + 1, _
                                        .Text3 = String.Format("Grandchild {0}", i * 100 + k * 10 + l + 1)}
              item2.SubItems.Add(item3)
            Next
          Next
        Next
        Return col
      End Function
    
      Public Class C1
        Public Property ID1 As Integer
        Public Property Text1 As String
        Public Property SubItems As New ObservableCollection(Of C2)
      End Class
    
      Public Class C2
        Public Property ID2 As Integer
        Public Property Text2 As String
        Public Property SubItems As New ObservableCollection(Of C3)
      End Class
    
      Public Class C3
        Public Property ID3 As Integer
        Public Property Text3 As String
      End Class
    
    End Class
    

    --
    Viele Gruesse
    Peter

  • Dienstag, 25. September 2012 08:36
     
     

    Hallo Peter,

    Danke für die schnelle Antwort. Ich werde es mal probieren, allerdings muss ich es noch im C# umschreiben, das dauert ein bisschen, da ich mit der Syntax noch nicht so fit bin.

    Gruß Edgar

  • Freitag, 12. Oktober 2012 06:45
    Besitzer
     
     

    Danke für die schnelle Antwort. Ich werde es mal probieren, allerdings muss ich es noch im C# umschreiben, das dauert ein bisschen, da ich mit der Syntax noch nicht so fit bin.

    Hallo Edgar Wenisch,

    Scahu Dir mal auch folgende Konverters an. Vielleicht können sie Dir weiterhelfen.

    http://converter.telerik.com/

    How does Code Converter compare? – hier oben hast Du Links zu mehrere Konverters.

    Code Converters

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.