XtraGrid 支持按照一列或多列的取值对数据分组。 分组功能是由 网格视图 类及其子类提供的。 本文档提供分组相关的方法的概述。 处理分组行 章节描述了使用分组行和访问相关数据。
当前文档包含下列小节:
概述
如果通过单个列对网格中的数据分组,则在同一列中有相同取值的记录可以被排列在相应的数据组中。 每个数据组都由一个分组行标识,可以展开分组行来访问它的下层数据行。 然后,如果使用另一列再次对数据分组,则根据新分组列的取值,每个组中的数据行又被组合到第二层分组中。
最终用户可以通过把特定列的标头从 列标头面板 或 “自定义”窗体 中拖放到 分组面板 中,从而使用该列对数据分组。 要取消数据分组,则通过拖动操作把列标头从分组面板中移除。 也可以使用拖放操作改变分组列的顺序。
也可以通过从 列标头的上下文菜单 中选中“Group By This Field(使用此字段分组)”菜单项,从而使用该列对数据分组。 要取消数据分组,则使用同一菜单中的“UnGroup(取消分组)”菜单项,或使用 分组面板的上下文菜单 中的“Clear Grouping(清除分组)”菜单项 。
始终按照分组列对记录排序。 如果对未排序的列执行数据分组,则网格控件自动以升序对该列排序。 接下来,如果从分组面板中移除该列,则它的排序设置将被清除。
如果需要允许对显示自定义数据的列排序/分组,则可以为列对象实现 System.IComparable 接口。 请参阅 MSDN,获取实现此接口的示例。
通过代码分组
要按照一个列对数据分组,则应该把它添加到分组列的集合中。 要执行此任务,则可以使用下列方法之一:
- 把列的 GridColumn.GroupIndex 属性设置为非负整数值。 该取值表示列在分组列集合中的位置。 GridColumn.GroupIndex 属性的取值决定了分组的层级。 例如,如果此索引是 0,则首先按照该列、然后按照后面的列对行分组。 要取消特定列对行的分组,则把该列的 GridColumn.GroupIndex 属性设置为 -1。
- 把一个 GridColumnSortInfo 项添加 ColumnView.SortInfo 集合中的起始位置,并把集合的 GridColumnSortInfoCollection.GroupCount 属性设置为分组列的数目。 如果需要把数据按照单个列分组,则把一个引用该列的 GridColumnSortInfo 项添加到集合中的起始位置,并把 GroupCount 设置为 1。 如果要使用两个列对数据分组,则把两个引用这些列的 GridColumnSortInfo 对象添加集合中的起始位置,并把 GroupCount 设置为 2,等等。
ColumnView.SortInfo 集合支持对视图中的列应用分组和排序。 集合中的每个元素都是由 GridColumnSortInfo 对象表示的,并且此对象引用了某个列 (GridColumn 对象),指定了应用于该列的排序顺序 (ColumnSortOrder 值)。 首先,始终按照分组列对数据排序。 因此,引用分组列的 GridColumnSortInfo 对象始终被放置在集合中的首个位置。 分组元素的数目是由 GridColumnSortInfoCollection.GroupCount 属性指定的。 集合中随后的元素仅引用了用于数据排序的列。 如果 GroupCount 为 0,则相应的视图不应用分组,并且所有元素都引用已排序的列。
要把元素添加到 ColumnView.SortInfo 集合中,则可以使用 GridColumnSortInfoCollection.ClearAndAddRange 和 GridColumnSortInfoCollection.Insert 方法。 GridColumnSortInfoCollection.ClearAndAddRange 方法允许清除任何现有的排序/分组设置,并把新项添加到集合中,同时为 GridColumnSortInfoCollection.GroupCount 属性指定取值。
下列代码展示了如何使用两个列 (“Country”和“City”) 进行分组,并使用另一列 (“CompanyName”) 排序。 之前的排序和分组设置被清除。 “Country”和“CompanyName”列将按升序排序,而“City”列按降序排序。C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Columns; // ... GridView View = gridControl1.FocusedView as GridView; gridView1.SortInfo.ClearAndAddRange(new GridColumnSortInfo[] { new GridColumnSortInfo(view.Columns["Country"], DevExpress.Data.ColumnSortOrder.Ascending), new GridColumnSortInfo(view.Columns["City"], DevExpress.Data.ColumnSortOrder.Descending), new GridColumnSortInfo(view.Columns["CompanyName"], DevExpress.Data.ColumnSortOrder.Ascending) }, 2); |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Columns ' ... Dim View As GridView = GridControl1.FocusedView GridView1.SortInfo.ClearAndAddRange(New GridColumnSortInfo() { _ New GridColumnSortInfo(view.Columns("Country"), DevExpress.Data.ColumnSortOrder.Ascending), _ New GridColumnSortInfo(view.Columns("City"), DevExpress.Data.ColumnSortOrder.Descending), _ New GridColumnSortInfo(view.Columns("CompanyName"), DevExpress.Data.ColumnSortOrder.Ascending) _ }, 2) |
如果您的代码由多个改变列的分组/排序设置的语句组成,则在默认情况下网格将在每个语句之后重设数据顺序。 要防止过度重设数据顺序,则可以使用 ColumnView.BeginSort 和 ColumnView.EndSort 方法 (或选用 GridColumnSortInfoCollection.BeginUpdate 和 GridColumnSortInfoCollection.EndUpdate 方法)。 这些方法允许执行批量更改。 如果把影响多列分组/排序的代码放置在这些方法内部,则只重设顺序一次 —— 在调用 ColumnView.EndSort (GridColumnSortInfoCollection.EndUpdate) 方法之后。 要获得关于批量更改方法的信息,请参阅 批量更改概述 章节。
要取消所有列的分组,则可以使用 GridView.ClearGrouping 方法。 在应用新的分组设置之前,调用此方法很有用,因此它保持现有的非分组列的排序设置。
下列代码展示了如何按照“Is In Stock”和“Category”列并使用它们的 GridColumn.GroupIndex 属性对数据分组:C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; //... GridView View = gridView1; view.BeginSort(); try { View.ClearGrouping(); View.Columns["Is In Stock"].GroupIndex = 0; View.Columns["Category"].GroupIndex = 1; } finally { View.EndSort(); } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid '... Dim View As GridView = gridView1 view.BeginSort() Try View.ClearGrouping() View.Columns("Is In Stock").GroupIndex = 0 View.Columns("Category").GroupIndex = 1 Finally View.EndSort() End Try |
在默认情况下,为列应用分组的代码把这些列移动到分组面板中,并在网格视图区域内隐藏它们。 如果在分组时需要使分组列的数据可视,则把 GridOptionsView.ShowGroupedColumns 属性设置为 true。 该属性也影响当最终用户对数据分组时,分组列如何被隐藏。
如果 GridOptionsView.ShowGroupedColumns 属性值设置为 true,则仍然可以通过把列移动到 “自定义”窗体 或把它的 GridColumn.VisibleIndex 属性设置为 -1,从而实现在视图区域中隐藏分组列。在默认情况下,带区网格视图和高级带区网格视图的 BandedGridOptionsView.ShowGroupedColumns 属性值是 true,并且在应用分组时,列保留在视图中。 把此属性设置为 false,则当使用该列进行分组时,从视图区域中移除该列。
也可以通过由 ColumnView.GroupedColumns 属性引用的只读集合来访问所有分组列。
禁用分组
- GridOptionsView.ShowGroupPanel 属性指定 分组面板 的可视性。 如果此面板被隐藏,则最终用户不能使用拖放操作来对数据分组。 在这种情况下,最终用户只能使用分组行的标题来决定分组列的顺序。
- 使用 GridOptionsMenu.EnableColumnMenu 和 GridOptionsMenu.EnableGroupPanelMenu 属性来禁用列标头菜单和分组面板菜单。 注意,也可以定制这些菜单,如同在 为弹出式菜单实现自定义行为 主题中描述的那样。
- GridOptionsCustomization.AllowGroup 属性指定最终用户是否可以在视图中应用数据分组。 如果该属性值是 false,则只能通过代码应用分组。 如果此属性值设置为 true,并且可以按照所需的列进行分组和排序,则最终用户可以对数据分组。
- GridOptionsCustomization.AllowSort 属性指定最终用户是否可以对数据排序。 如果排序被禁用,则数据不能被分组。
- 列的 OptionsColumn.AllowGroup 选项控制了最终用户是否可以对该列应用分组。
- 列的 OptionsColumn.AllowSort 选项决定最终用户是否可以按照该列对行排序。 按照上述说明,仅当列支持分组时,分组才可用。
- 列的 OptionsColumn.AllowMove 选项和视图的 GridOptionsCustomization.AllowColumnMoving 选项控制最终用户是否可以移动列。 因为分组就意味着把列移动到分组面板,因此只需要禁止列被移动,就可以禁用分组。
C# | 复制代码 |
---|---|
gridView1.Columns[0].OptionsColumn.AllowGroup = DevExpress.Utils.DefaultBoolean.False; |
Visual Basic | 复制代码 |
---|---|
GridView1.Columns(0).OptionsColumn.AllowGroup = DevExpress.Utils.DefaultBoolean.False
|
通过使用拖放事件 (GridView.DragObjectStart、GridView.DragObjectOver 和 GridView.DragObjectDrop),可以控制如何把列标头拖放到视图中。 例如,可以接管 GridView.DragObjectOver 事件来防止列被拖放到分组面板中的特定位置。
分组行
对应于第一个分组列的分组行被显示在最上层。 对应于第二个分组列的分组行被显示在第二个分组层,等等。 在默认情况下,每个分组行的显示文本都标识了列标题、分组取值和分组汇总文本 (如果存在)。 要修改文本在分组行中的显示格式,则使用 GridView.GroupFormat 属性。 在默认情况下,此属性被设置为 {0}: [#image]{1} {2}。 {0}、{1} 和 {2} 字符串是占位符,分别表示分组列的标题、取值和分组行的汇总文本。 [#image] 字符串是一个图像占位符,表示当按照包含 ImageComboBoxEdit 内置编辑器的列进行分组时所显示的图像。 下面的插图展示了一个网格视图,它的 GridView.GroupFormat 属性被设置为默认值。
要全面控制分组行的绘制,则接管 GridView.CustomDrawGroupRow 事件。
为分组行应用样式 章节展示了如何为不同的分组行指定不同的样式。