在默认情况下,每个分组行的所有 分组汇总 都被计算 (参阅 分组行)。 本主题展示了如何隐藏特定分组行的特定分组汇总。
总说明
在运行时刻通过 GridView.GroupSummary 集合,或在设计时刻通过网格控件设计器的 “Group Summary Items(分组汇总项)”页面,都可以创建分组汇总。 对于每个数据组和所显示的每个分组行,所有为它们指定的汇总都将被计算。 考虑下列网格控件,它包含两个分组列,因此包含两个分组层级。
这两个分组汇总被用于对数据组计算 SUM 和 COUNT 函数。 可以看到,对于与“Sales Person” 和 “Category Name” 分组列对应的两个组,这些函数都被计算。
注意 |
---|
注意,在此网格控件中,指定分组行格式的 GridView.GroupFormat 属性被设置为 "{0} [#image]{1} -- {2}"。 因此汇总值与分组值之间被两个破折号分隔。 |
在某些情况下,需要计算特定分组行的特定汇总,并防止计算其他分组层级中的行的特定汇总。 例如,在下面的插图中,仅计算与“Sales Person”列对应的分组行的 COUNT 函数,而不计算与“Category Name”列对应的分组行的 COUNT 函数:
如果只计算 XtraGrid 中特定分组行的分组汇总,则使用下列解决方案:
- 创建分组汇总项,它们表示需要被计算的所有分组汇总。
- 把唯一值指派到汇总项的 GridSummaryItem.Tag 属性。 这样允许您在后面的处理中识别此汇总项。
- 接管 GridView.CustomSummaryExists 事件来防止特定分组行的特定汇总项被计算。
在启动汇总计算之前,GridView.CustomSummaryExists 事件为每个分组汇总项和为每个分组层级发生。 当前被处理的分组项和分组层级分别通过事件的 Item 和 GroupLevel 参数来标识。 GroupLevel 属性表示一个整数值,指定当前分组行在分组行层次结构中的的级别。 它也可用于获取与当前分组行相对应的分组列。 要获取该列,则在 ColumnView.GroupedColumns 集合中与分组层级匹配的索引位置读取取值。 要防止当前的汇总在当前层级被计算,则把事件的 Exists 参数设置为 false。
示例
假设网格控件包含了“Sales Person”、“Category Name” 和 “Extended Price”列。 按照前两个列对数据分组,并且需要对下列数据组计算汇总: 1) COUNT 函数计算每个组中记录的数目; 2) SUM 函数计算每个组中“Extended Price”列的合计。 本示例展示了如何计算与“Sales Person”分组列相应的 COUNT 函数,并防止为其他组计算该函数。 为所有数据组计算 SUM 函数。
-
创建分组汇总
首先创建两个需要被计算的分组汇总 (COUNT 和 SUM)。 在设计时刻,打开 “Group Summary Items(分组汇总项)”页面,通过单击 Add 按钮来添加两个汇总项。
第一个汇总项表示 COUNT 函数。 设置它的属性,如下所示:
- FieldName 设置为 "CategoryName";
- SummaryType 设置为 Count;
- Tag 设置为 1 (数值);
- DisplayFormat 设置为 "Count = {0}"。
为第二个呈现 SUM 函数的汇总项设置属性,如下所示:
- FieldName 设置为 "Extended Price";
- SummaryType 设置为 Sum;
- Tag 设置为 2 (数值);
- DisplayFormat 设置为 "Sum = {0:c2}"
要在在运行时刻创建这些分组项,则使用下列代码:
C# 复制代码 GridSummaryItem item1 = gridView1.GroupSummary.Add(); item1.FieldName = "CategoryName"; item1.SummaryType = DevExpress.Data.SummaryItemType.Count; item1.Tag = 1; item1.DisplayFormat = "Count = {0}"; GridSummaryItem item2 = gridView1.GroupSummary.Add(); item2.FieldName = "Extended Price"; item2.SummaryType = DevExpress.Data.SummaryItemType.Sum; item2.Tag = 2; item2.DisplayFormat = "Sum = {0:c2}";
Visual Basic 复制代码 Dim item1 As GridSummaryItem = gridView1.GroupSummary.Add() item1.FieldName = "CategoryName" item1.SummaryType = DevExpress.Data.SummaryItemType.Count item1.Tag = 1 item1.DisplayFormat = "Count = {0}" Dim item2 As GridSummaryItem = gridView1.GroupSummary.Add() item2.FieldName = "Extended Price" item2.SummaryType = DevExpress.Data.SummaryItemType.Sum item2.Tag = 2 item2.DisplayFormat = "Sum = {0:c2}"
-
实现停止特定汇总计算的逻辑
接管 GridView.CustomSummaryExists 事件来防止与“CategoryName”列对应的分组行的 COUNT 函数被计算:
C# 复制代码 private void gridView1_CustomSummaryExists(object sender, CustomSummaryExistEventArgs e) { GridView View = sender as GridView; int summaryID = Convert.ToInt32((e.Item as GridSummaryItem).Tag); GridColumn groupColumn = View.GroupedColumns[e.GroupLevel]; // Do not calculate the Count summary against the group rows // that correspond to the CategoryName field if(groupColumn.FieldName == "CategoryName" && summaryID == 1) { e.Exists = false; } }
Visual Basic 复制代码 Private Sub GridView1_CustomSummaryExists(ByVal sender As Object, _ ByVal e As DevExpress.Data.CustomSummaryExistEventArgs) _ Handles GridView1.CustomSummaryExists Dim View As GridView = CType(sender, GridView) Dim summaryID As Integer = Convert.ToInt32(CType(e.Item, GridSummaryItem).Tag) Dim groupColumn As GridColumn = View.GroupedColumns(e.GroupLevel) ' Do not calculate the Count summary against the group rows ' that correspond to the CategoryName field If groupColumn.FieldName = "CategoryName" And summaryID = 1 Then e.Exists = False End If End Sub
最终结果将与下面的插图相像:
本示例的完整代码在下面展示:
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Columns; using DevExpress.Data; GridSummaryItem item1 = gridView1.GroupSummary.Add(); item1.FieldName = "CategoryName"; item1.SummaryType = DevExpress.Data.SummaryItemType.Count; item1.Tag = 1; item1.DisplayFormat = "Count = {0}"; GridSummaryItem item2 = gridView1.GroupSummary.Add(); item2.FieldName = "Extended Price"; item2.SummaryType = DevExpress.Data.SummaryItemType.Sum; item2.Tag = 2; item2.DisplayFormat = "Sum = {0:c2}"; //... private void gridView1_CustomSummaryExists(object sender, CustomSummaryExistEventArgs e) { GridView View = sender as GridView; int summaryID = Convert.ToInt32((e.Item as GridSummaryItem).Tag); GridColumn groupColumn = View.GroupedColumns[e.GroupLevel]; // Do not calculate the Count summary against the group rows // that correspond to the CategoryName field if(groupColumn.FieldName == "CategoryName" && summaryID == 1) { e.Exists = false; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Columns Imports DevExpress.Data Dim item1 As GridSummaryItem = gridView1.GroupSummary.Add() item1.FieldName = "CategoryName" item1.SummaryType = DevExpress.Data.SummaryItemType.Count item1.Tag = 1 item1.DisplayFormat = "Count = {0}" Dim item2 As GridSummaryItem = gridView1.GroupSummary.Add() item2.FieldName = "Extended Price" item2.SummaryType = DevExpress.Data.SummaryItemType.Sum item2.Tag = 2 item2.DisplayFormat = "Sum = {0:c2}" ' ... Private Sub GridView1_CustomSummaryExists(ByVal sender As Object, _ ByVal e As CustomSummaryExistEventArgs) _ Handles GridView1.CustomSummaryExists Dim View As GridView = CType(sender, GridView) Dim summaryID As Integer = Convert.ToInt32(CType(e.Item, GridSummaryItem).Tag) Dim groupColumn As GridColumn = View.GroupedColumns(e.GroupLevel) ' Do not calculate the Count summary against the group rows ' that correspond to the CategoryName field If groupColumn.FieldName = "CategoryName" And summaryID = 1 Then e.Exists = False End If End Sub |