WPF Datagrid使用Datatable作为ItemSsource进行分组

时间:2014-06-30 13:17:57

标签: c# wpf

我在数据网格内对数据进行分组时遇到问题。 数据包含在一个数据表中,该数据表由SQL数据库填充并绑定到我的数据网格。这一切都很好......

现在我想通过多次包含相同数字的字段'ID'对我的数据网格进行分组...我已经尝试了很多可能的解决方案,我在这里和那里找到了,但它们都没有工作。他们中的大多数使用CollectionViewSource而不是Datatable ......

是否有任何直接的方法来分组(+过滤)我的数据表并在数据网格中显示它? 我希望有人能帮助我找到一个简单的方法,或者至少给我一个提示我需要寻找的东西。

修改 要从SQL数据库获取数据,我使用以下(简化)代码:

this.db = new DBConnection(...);
DataTable dt_Applications = 
                        this.db.ExecuteReader( Properties.SqlQueries.SQL_GetApplications );

WPF:

<DataGrid Name="dg_Applications" 
          ItemsSource="{Binding dt_Applications}" 
          IsReadOnly="True" 
          CanUserResizeRows="False" 
          ClipboardCopyMode="IncludeHeader" 
          AutoGenerateColumns="True" />

数据看起来像:

[ID]   [Name]     [Var1]         [Var2]
0      "App0"     "Value0.1.0"   "Value0.2.0"
0      "App0"     "Value0.1.1"   "Value0.2.1"
0      "App0"     "Value0.1.2"   "Value0.2.2"
1      "App1"     "Value1.1.0"   "Value1.2.0"
2      "App2"     "Value2.1.0"   "Value2.2.0"
2      "App2"     "Value2.1.1"   "Value2.2.1"

输出:

[ID]   [Name]     [Var1]         [Var2]
"App0 [0]:"
-      -          "Value0.1.0"   "Value0.2.0"
-      -          "Value0.1.1"   "Value0.2.1"
-      -          "Value0.1.2"   "Value0.2.2"
"App1 [1]:"
-      -          "Value1.1.0"   "Value1.2.0"
"App2 [2]:"
-      -          "Value2.1.0"   "Value2.2.0"
-      -          "Value2.1.1"   "Value2.2.1"

2 个答案:

答案 0 :(得分:7)

我找到了解决问题的方法......

可以将DataTable直接绑定到CollectionViewSource对象!

有了这个,没有什么可做的了。更改DataTable时,DataGrid会自动重新加载。 所有分组和过滤都可以像Alex Bell的link中所描述的那样完成。

<Window.Resources>
    <CollectionViewSource x:Key="cvsDataTable" Source="{Binding dt_myDataTable}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="ID"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

<DataGrid Name="dg_myDataTable" ItemsSource="{Binding Source={StaticResource cvsDataTable}}">
    <DataGrid.GroupStyle>...</DataGrid.GroupStyle>
    <DataGrid.Columns>...</DataGrid.Columns>
</DataGrid>

答案 1 :(得分:1)

要以编程方式执行上述操作,您可以尝试以下代码,

CollectionViewSource mycollection = new CollectionViewSource();
mycollection.Source = MyDataTable;
mycollection.GroupDescriptions.Add(new PropertyGroupDescription("PropertyToGroup"));
dataGrid.ItemsSource = mycollection.View;

此处MyDataTable是您的网格的可数据源,而PropertyToGroup是您想要按其分组的属性,可能是DataTable中的列。