Datagrid Grouping mit DataTable

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von HamburgerJungeJr.

    Datagrid Grouping mit DataTable

    Moin,
    Ich möchte Daten aus einer DataTable in einem Datagrid anzeigen. Die funktioniert auch.
    Zusätzlich möchte ich diese Daten Gruppieren.
    Dies mache ich wie folgt:

    VB.NET-Quellcode

    1. Dim cv As ICollectionView = CollectionViewSource.GetDefaultView(loadTicker)
    2. cv.GroupDescriptions.Add(New PropertyGroupDescription("vId"))
    3. g_Ticker.DataContext = cv
    4. Dim dtTicker As dsTechnikVeranstaltungen.dtTickerDataTable = dsTechnikVeranstaltungen.dtTicker
    5. Dim con As New OleDbConnection
    6. Dim cmd As New OleDbCommand
    7. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & My.Settings.Datenbank & "; Persist Security Info=True;"
    8. cmd.Connection = con
    9. Try
    10. con.Open()
    11. cmd.CommandText = "SELECT Verfügbar.vfId, Veranstaltungen.vId, Veranstaltungen.vDatum, Veranstaltungen.vBeginn, Veranstaltungen.vTreffen, Veranstaltungen.vName, Verfügbar.vfVerfügbar, Verfügbar.vfNichtVerfügbar, Anwender.aNachname, Anwender.aVorname FROM Anwender RIGHT JOIN (Veranstaltungen LEFT JOIN Verfügbar ON Veranstaltungen.vId = Verfügbar.vfIdVeranstaltung) ON Anwender.aId = Verfügbar.vfIdAnwender WHERE(((Veranstaltungen.vDatum) > Now())) ORDER BY Veranstaltungen.vDatum, Veranstaltungen.vTreffen, Verfügbar.vfVerfügbar, Anwender.aNachname, Anwender.aVorname;"
    12. Dim reader As OleDbDataReader = cmd.ExecuteReader
    13. dtTicker.Load(reader)
    14. reader.Close()
    15. con.Close()
    16. Catch ex As Exception
    17. MessageBox.Show(ex.Message)
    18. End Try
    19. Return dtTicker


    In den Group-Headers möchte ich bestimmte Felder ausgeben lassen. Dazu habe ich folgendes Template:

    XML-Quellcode

    1. ​<Grid x:Name="g_Ticker">
    2. <DataGrid x:Name="dg_Veranstaltungen" Style="{StaticResource dataGridTickerStyle}" ItemsSource="{Binding}" CanUserAddRows="False" AutoGenerateColumns="False">
    3. <DataGrid.Columns>
    4. <DataGridTextColumn Binding="{Binding vName}" />
    5. <DataGridTextColumn Binding="{Binding aNachname}" />
    6. <DataGridTextColumn Binding="{Binding aVorname}" />
    7. <DataGridCheckBoxColumn Binding="{Binding vfVerfügbar}" />
    8. <DataGridCheckBoxColumn Binding="{Binding vfNichtVerfügbar}" />
    9. </DataGrid.Columns>
    10. <DataGrid.GroupStyle>
    11. <GroupStyle>
    12. <GroupStyle.ContainerStyle>
    13. <Style TargetType="{x:Type GroupItem}">
    14. <Setter Property="Template">
    15. <Setter.Value>
    16. <ControlTemplate TargetType="{x:Type GroupItem}">
    17. <Expander>
    18. <Expander.Header>
    19. <DockPanel TextBlock.FontWeight="Bold">
    20. <TextBlock Text="{Binding vName}" />
    21. </DockPanel>
    22. </Expander.Header>
    23. <ItemsPresenter />
    24. </Expander>
    25. </ControlTemplate>
    26. </Setter.Value>
    27. </Setter>
    28. </Style>
    29. </GroupStyle.ContainerStyle>
    30. </GroupStyle>
    31. </DataGrid.GroupStyle>
    32. </DataGrid>
    33. </Grid>

    Der Header bleibt aber immer leer.
    Wenn ich den Header-Text fest setzte wird er mir angezeigt.

    Was mach ich falsch.

    Gruß
    HamburgerJungeJr
    Der Converter

    VB.NET-Quellcode

    1. ​Imports System
    2. Imports System.Globalization
    3. Imports System.Windows.Controls
    4. Imports System.Windows.Data
    5. Imports System.Data
    6. Namespace Converter
    7. Public Class GroupTitleConverter
    8. Implements IValueConverter
    9. Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
    10. Dim groupItem As GroupItem = CType(value, GroupItem)
    11. Dim collectionviewGroup As CollectionViewGroup = CType(groupItem.Content, CollectionViewGroup)
    12. Dim drTicker As dsTechnikVeranstaltungen.dtTickerRow = CType(CType(collectionviewGroup.Items(0), DataRowView).Row, dsTechnikVeranstaltungen.dtTickerRow)
    13. Dim title As String = String.Format("{0} - {1} {2}", drTicker.vDatum.ToString("dd.MM.yyyy"), drTicker.vTreffen.ToString("HH:mm"), drTicker.vName)
    14. Return title
    15. End Function
    16. Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
    17. Throw New NotImplementedException
    18. End Function
    19. End Class
    20. End Namespace


    Im XAML
    Ressourcen

    VB.NET-Quellcode

    1. <convert:GroupTitleConverter x:Key="groupTitleConverter" />
    2. <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
    3. <Setter Property="Template">
    4. <Setter.Value>
    5. <ControlTemplate TargetType="{x:Type GroupItem}">
    6. <Expander x:Name="exp" Background="White" Foreground="Black" IsTabStop="False">
    7. <Expander.Header>
    8. <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupItem}}, Converter={StaticResource ResourceKey=groupTitleConverter}}" />
    9. </Expander.Header>
    10. <ItemsPresenter Focusable="False"/>
    11. </Expander>
    12. </ControlTemplate>
    13. </Setter.Value>
    14. </Setter>
    15. </Style>


    Das Datagrid

    VB.NET-Quellcode

    1. <DataGrid x:Name="dg_Veranstaltungen" Style="{StaticResource dataGridTickerStyle}" ItemsSource="{Binding}" CanUserAddRows="False" AutoGenerateColumns="False" SelectionMode="Single">
    2. <DataGrid.Columns>
    3. <DataGridTextColumn Header="Nachname" Binding="{Binding aNachname}" />
    4. <DataGridTextColumn Header="Vorname" Binding="{Binding aVorname}" />
    5. <DataGridCheckBoxColumn Header="Verfügbar" Binding="{Binding vfVerfügbar}" />
    6. <DataGridCheckBoxColumn Header="N. Verfügbar" Binding="{Binding vfNichtVerfügbar}" />
    7. </DataGrid.Columns>
    8. <DataGrid.GroupStyle>
    9. <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}" >
    10. <GroupStyle.Panel>
    11. <ItemsPanelTemplate>
    12. <DataGridRowsPresenter>
    13. </DataGridRowsPresenter>
    14. </ItemsPanelTemplate>
    15. </GroupStyle.Panel>
    16. </GroupStyle>
    17. </DataGrid.GroupStyle>
    18. </DataGrid>