none
TreeViewItem: "Binden" einer DataTable an ein DataGrid RRS feed

  • Frage

  • Hallo liebe Community,

    ich habe zur Zeit ein recht kurioses Problem. Da ich jedoch noch recht neu im Bereich WPF bin, kann es durchaus sein, das die Lösung trivial ist, jedoch konnte mir meine "Suchmaschine" dieses mal nicht weiter helfen. Zu meinem Problem: Ich entwickle gerade eine Art Reporting Tool, welches bestimmte Daten aus einer Datenbank ausliest und diese dann hierarchisch in einem TreeView darstellen soll.

    Klassendefinitionen:

    class Entwickler //Enthält einen Namen und eine Liste von Units (Units sind in dem Fall Games, Apps, Themes, Ringtones, etc)

    class Unit //Enthält einen Namen und eine Liste von Produkten

    class Produkt //enthält eine Datentabelle mit den aufbereiteten Informationen aus der Datenbank Bei der Eingabe gebe ich noch an, aus welchem Zeitraum die Daten gelesen werden sollen.

    Als nächstes habe ich mir die Templates für den TreeView erstellt:

    <Window.Resources>
    		<HierarchicalDataTemplate DataType="{x:Type local:Entwickler}" ItemsSource="{Binding Path=ListeDerUnits}" >
    				<TextBlock Text="{Binding Entwicklername}"></TextBlock> 
    		</HierarchicalDataTemplate>
    		
    		<HierarchicalDataTemplate DataType="{x:Type local:Unit}" ItemsSource="{Binding Path=ListeDerProdukte}" >
    				<TextBlock Text="{Binding Unitname}"></TextBlock>
    		</HierarchicalDataTemplate> 
    
    		<DataTemplate DataType="{x:Type local:Produkt}"> 
    				<DataGrid Name="_dg1" ItemsSource="{Binding Path=Datentabelle}" AutoGenerateColumns="True" EnableColumnVirtualization="True">
    				</DataGrid> 
    		</DataTemplate> 
    </Window.Resources>
    

    ... und natürlich den TreeView selbst:

    <TreeView Name="_myTreeView" Grid.Row="2" Grid.ColumnSpan="2" Margin="15,15,35,50" />

    Die Entwickler selbst sammle ich dann später in einer ObservableCollection<Entwickler> und weise sie dem DataContext Property des TreeViews zu. Ziel soll es sein, die aufbereiteten Daten folgendermaßen hierarchisch darzustellen:

    -> Entwickler A 
    -----> Games 
    ----------> (DataGrid mit allen Games von Entwickler A) 
    -----> Apps 
    -> Entwickler B 
    -----> Apps 
    -----> Themes 
    -> Entwickler C 
    ->... 
    

    Wie im DataTemplate oben angegeben soll das DataGrid seine Daten aus der jeweiligen DataTable des Produktes ziehen. Bis hierher klappt alles wunderbar. Die Entwickler werden korrekt gefiltert. Jeder Entwickler hat die korrekten Units und Produkte die ihm untergeordnet sind. Die Datentabellen enthalten alle Daten und sind nicht leer. Das Problem ist nun, das das DataGrid zwar beim Aufklappen immer die korrekte Anzahl an Spalten und Reihen anzeigt. Auch die Namen der Produkte in der ersten Spalte werden korrekt angezeigt. Der Rest des DataGrids ist jedoch leer. es werden dort keinerlei Daten angezeigt.

    Die Spalten meiner DataTables (von den Produkten) sind folgende:

    Spalte 1: Name des Produktes //dieser wird korrekt angezeigt

    Spalte 2+3: Double Werte für einen Monat

    Spalte 4+5: Double Werte für nächsten Monat //Falls am Anfang ein Zeitintervall von mehr als einem Monat gewählt wurde

    ... Hoffe hier hat jemand einen Zaunpfahl den er mal kurz schwenken könnte.

    MfG und Danke im Vorraus

    €dit: Mir ist gerade noch eingefallen ... Ich habe auch schon versucht das DataTemplate so zu modifizieren, das das DataGrid an ein DataView gebunden wird, jedoch kein Erfolg.

    • Bearbeitet Schlurb Dienstag, 22. Februar 2011 13:11
    Dienstag, 22. Februar 2011 09:22

Alle Antworten

  • Hast du mal versucht die Spalten in dem DataGrid per XAML manuell zu erzeugen und zu binden (AutoGenerateColumns auf false stellen...)?

    Dienstag, 22. Februar 2011 13:11
    Beantworter
  • Hast du mal versucht die Spalten in dem DataGrid per XAML manuell zu erzeugen und zu binden (AutoGenerateColumns auf false stellen...)?

    Nein, denn die Anzahl der Spalten kann immer variieren. Je nach Anzahl der Monate die am Anfang als Zeitintervall eingegeben werden, bekommen die Produkttabellen zusätzliche Spalten. AFAIK kann man das per XAML nicht realisieren

    Dienstag, 22. Februar 2011 13:15
  • Soll nur ein Test sein, ob die Daten generell angezeigt werden können oder ob es an einer Einstellung liegt...

    Evtl. würde ich das EnableColumnVirtualization auch mal auf False setzen...


    Dienstag, 22. Februar 2011 13:27
    Beantworter
  • Hallo,

    ich habe jetzt nochmal den ganzen Code durchgesehen und alles ein bischen bereinigt. Dabei habe ich auch zwangsweise ein bisschen mit den DataTables herumgespielt. Dabei ist mir aufgefallen, das, wenn die Texteigenschaft der ColumnHeader ein "/" enthält, keine Daten angezeigt werden. Es werden dann nur Daten in der ersten Spalte angezeigt, welche vom typ string ist. Mittlerweile funktioniert alles so, wie ich es mir vorgestellt habe. Ich habe lediglich noch ein kleines Problem: Wenn ich meine Items im TreeView aufklappe erscheinen jeweils die korrekten ChildItems. Wenn ich ein ChildItem vom Typ Unit aufklappe, erscheint auch wie im DataTemplate angegeben das DataGrid mit der jeweiligen DataTable als Source. Sämtliche Texte sind jedoch linksbündig in den Zellen ausgerichtet. Welche Möglichkeiten hätte ich denn hier zB den Text rechtsbündig auszurichten ? Mir würde jetzt nur einfallen, mich irgendwie in das TreeViewItemWurdeAufgeklappt-Event  einzuhaken und für die jeweilige Tabelle die Textausrichtung manuell mitzugeben ?! Gibt es da eventuell eine einfachere Möglichkeit ?

     

    Thx und cya

    Donnerstag, 24. Februar 2011 13:19