关于 syncfusion-winforms-grid-grouping-control
面向开发者的指南,介绍如何在 Windows Forms 应用中实现 Syncfusion GridGroupingControl。内容涵盖数据绑定、分组与层级关系,以及导出和性能优化。
主要功能
- 01层级分组与多列分组
- 02排序、筛选和汇总
- 03主从数据关系
- 04编辑、选择与样式设置
- 05数据导出和打印
- 06大数据集虚拟化指南
适用场景
- 01构建分组业务数据视图
- 02展示嵌套的父子记录
- 03添加筛选、汇总和自定义排序
- 04导出或打印网格数据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ syncfusion/ winforms-ui-components-skills --skill syncfusion-winforms-grid-grouping-control安装后在 Claude Code 中输入/syncfusion-winforms-grid-grouping-control确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-features.mdappearance-and-formatting.mdcell-types.mdclipboard-operations.mdcolumn-management.mddata-binding.mdediting.mdevents.mdexporting.mdfiltering.mdgetting-started.mdgrid-layout.mdgrouping.mdnavigation-and-scrolling.mdperformance.mdprinting.mdrelations-and-hierarchy.mdselections.mdsorting.mdsummaries.mdtroubleshooting.md详细介绍
实现 Grid Grouping 控件
全面介绍如何实现 Syncfusion® Windows Forms GridGroupingControl——一款企业级网格组件,内置支持层次分组、筛选、多列排序、汇总和复杂数据关系。
何时使用此技能
在以下情况下使用此技能:
- 在 Windows Forms 应用程序中实现 GridGroupingControl
- 显示层次结构或分组数据,按一列或多列自动分组
- 创建主从关系,使用嵌套表和子关系
- 应用高级筛选(类似 Excel 的筛选、动态筛选或编程筛选)
- 添加数据汇总(组汇总、标题汇总、表汇总)
- 按单列或多列排序数据,并使用自定义排序逻辑
- 处理大型数据集,并进行虚拟化和性能优化
- 将分组数据导出到 Excel、PDF、CSV、HTML 或 Word
- 自定义网格外观,使用条件格式和样式
- 绑定到各种数据源(DataTable、XML、集合、动态对象)
对于需要高级数据分组、下钻功能和全面数据管理功能的应用程序,此技能必不可少。
组件概览
GridGroupingControl 是一款功能强大的数据网格组件,通过以下功能扩展了标准网格功能:
- 层次分组: 根据字段值将数据组织为嵌套组
- 分组拖放区域: 可通过拖放列标题进行分组的交互区域
- 多级排序: 按多列排序,并支持自定义排序逻辑
- 高级筛选: 类似 Excel 的筛选、动态筛选和编程记录筛选
- 汇总: 列汇总、组汇总和标题汇总,支持聚合计算
- 主从支持: 显示具有父子关系的嵌套表
- 数据虚拟化: 处理数百万条记录并实现即时滚动
- 丰富的编辑功能: 支持就地编辑、验证和自定义编辑器
- 灵活的样式设置: 条件格式、主题和单元格级自定义
此控件专为需要企业级数据管理功能的业务应用程序而设计。
文档和导航指南
入门
📄 阅读: references/getting-started.md
- 安装和程序集部署
- 通过设计器和代码创建 GridGroupingControl
- 基本数据源绑定
- 填充数据并创建首个网格示例
- 必要属性和初始配置
数据绑定和数据源
📄 阅读: references/data-binding.md
- ADO.NET 数据绑定(DataTable、DataSet、DataView)
- 使用 ReadXml/WriteXml 进行 XML 数据绑定
- 自定义集合(IList、IBindingList、ITypedList)
- 强类型集合和泛型集合
- .NET 4.0+ 的动态对象绑定
- 使用自定义列的非绑定模式
- 集合接口和更改通知
阅读时机: 设置数据源、绑定到数据库、使用自定义对象或实现非绑定场景时。
分组功能
📄 阅读: references/grouping.md
- 添加数据分组(通过设计器或编程方式)
- GroupDropArea 配置和自定义
- 多列分组和嵌套组
- 使用 IComparer 和 IGroupByColumnCategorizer 进行自定义分组
- GroupBy 选项(标题、页脚、预览行)
- GroupCaptionSection 和标题文本标记
- 使用分组(展开/折叠、遍历、访问)
- 分组事件和自定义
阅读时机: 实现分组功能、自定义分组外观、使用嵌套组或处理分组相关事件时。
排序操作
📄 **阅读:references/sorting.md
- 使用 SortedColumns 集合以编程方式排序
- 按优先级进行多列排序
- 排序图标的位置和自定义
- 移除和清除排序
- 对分组列进行排序
- 按汇总值排序
- 按显示成员排序(外键关系)
- 使用 IComparer 自定义排序
- 排序事件(Changing/Changed)
**何时阅读:**实现排序功能、自定义排序行为、按计算值排序或处理排序事件时。
筛选和搜索
📄 **阅读:references/filtering.md
- 设置筛选栏以供用户筛选
- 记录筛选(以编程方式筛选)
- 使用运算符按表达式筛选
- 使用 GridDynamicFilter 进行动态筛选
- 类 Excel 筛选(Optimized 和 Office2007)
- 按颜色、数字、日期和值为 null 的项目筛选
- 按显示成员而非值成员筛选
- 堆叠标题筛选
- 获取已筛选的记录和筛选字符串
- 筛选事件
**何时阅读:**实现筛选功能、类 Excel 筛选 UI、以编程方式筛选数据或自定义筛选时。
汇总和聚合
📄 **阅读:references/summaries.md
- 汇总类型(Column、Group、Table、Caption)
- 使用 SummaryDescriptor 添加汇总
- 内置聚合函数(Sum、Average、Count、Min、Max)
- 使用 ISummaryAggregate 创建自定义汇总
- 按汇总值排序
- 汇总外观和格式设置
- 在组标题中显示汇总
- 汇总事件
**何时阅读:**添加聚合计算、显示组总计、实现自定义聚合或在标题中显示汇总时。
关系和层次结构
📄 **阅读:references/relations-and-hierarchy.md
- 设置主从关系
- 配置嵌套表
- 关系描述符和子表描述符
- 层次结构的显示和导航
- 展开/折叠嵌套表
- 以编程方式处理子表
- 外键引用关系
**何时阅读:**实现主从网格、显示嵌套数据、配置父子关系或处理层次数据时。
编辑功能
📄 **阅读:references/editing.md
- 启用/禁用编辑
- 单元格编辑模式和激活
- 当前单元格行为
- 数据验证
- 编辑事件(StartEditing、EditingComplete)
- 自定义编辑器和单元格类型
- AddNew 记录功能
**何时阅读:**配置编辑行为、实现验证、自定义编辑器或处理编辑事件时。
选择功能
📄 **阅读:references/selections.md
- 选择模式(None、One、Multiple、MultiSimple、MultiExtended)
- 记录选择与单元格选择
- 以编程方式选择
- 获取已选记录
- 选择事件
- 选择外观
**何时阅读:**实现选择功能、以编程方式选择记录或自定义选择行为时。
列管理
📄 **阅读:references/column-management.md
- 以编程方式添加/移除列
- 列属性(Width、HeaderText、MappingName)
- 列宽和自动调整大小
- 列可见性和 VisibleColumns 集合
- 列重新排序和拖放
- 冻结列
- 非绑定列
**何时阅读:**管理列可见性、配置列属性、实现冻结列或添加非绑定列时。
外观和样式
📄 阅读: references/appearance-and-formatting.md
- 单元格样式和 GridStyleInfo
- 条件格式
- 主题和视觉样式
- 行和列的外观
- 用于动态设置样式的 QueryCellStyleInfo 事件
- 不同单元格类型的外观属性
- BackColor、ForeColor、Font 自定义
阅读时机: 自定义网格外观、应用条件格式、实现主题或为特定单元格设置样式时。
单元格类型和自定义
📄 阅读: references/cell-types.md
- 内置单元格类型(TextBox、ComboBox、CheckBox、Image)
- 带有 DataSource 的 ComboBox 单元格
- 用于布尔数据的 CheckBox 单元格
- 用于显示图形的 Image 单元格
- 自定义单元格类型和渲染器
- 单元格类型配置
阅读时机: 实现下拉列表、复选框、图像单元格或创建自定义单元格渲染器时。
网格布局
📄 阅读: references/grid-layout.md
- 行和列的大小设置(自动调整大小、适应)
- 用于分组列标题的堆叠标题
- 覆盖范围(合并单元格)
- 网格边框和线条
- 布局自定义和间距
阅读时机: 配置行高、实现堆叠标题、合并单元格或自定义网格布局时。
导航和滚动
📄 阅读: references/navigation-and-scrolling.md
- 导航栏配置
- 滚动选项和行为
- 键盘导航
- 当前单元格导航
- ScrollControlIntoView 方法
阅读时机: 配置导航行为、自定义键盘快捷键或实现编程式导航时。
剪贴板操作
📄 阅读: references/clipboard-operations.md
- 复制/粘贴操作
- 剪贴板格式(Text、CSV、HTML)
- 剪切操作
- 剪贴板自定义
- CopyPaste 事件
阅读时机: 实现复制/粘贴功能、自定义剪贴板格式或处理剪贴板事件时。
导出数据
📄 阅读: references/exporting.md
- 使用 ExcelExportingOptions 导出 Excel
- 使用 PdfExportingOptions 导出 PDF
- 导出 CSV
- 导出 HTML
- 导出 Word
- 导出选项和自定义
阅读时机: 实现数据导出功能、自定义导出格式或配置导出选项时。
打印
📄 阅读: references/printing.md
- 打印配置和设置
- 打印预览
- 打印设置(页边距、方向、缩放)
- 自定义打印布局
- PrintDocument 集成
阅读时机: 实现打印功能、自定义打印布局或配置打印设置时。
性能优化
📄 阅读: references/performance.md
- 对大型数据集进行虚拟化
- 处理数百万条记录
- 性能优化提示
- 数据绑定最佳实践
- 内存管理
阅读时机: 优化网格性能、处理大型数据集或排查性能问题时。
事件参考
📄 阅读: references/events.md
- 数据相关事件(QueryValue、SaveValue)
- UI 交互事件(CellClick、CellDoubleClick)
- 分组事件(GroupExpanding、GroupExpanded)
- 排序事件(SortedColumns.Changing/Changed)
- 筛选事件(RecordFilters.Changing/Changed)
- 编辑事件(CurrentCellStartEditing、EditingComplete)
- 完整的事件参考和示例
阅读时机: 处理网格事件、实现事件驱动逻辑或响应用户交互时。
高级功能
📄 阅读: references/advanced-features.md
- 用于计算列的表达式字段
- 数据验证规则
- 查找和替换功能
- 序列化(Binary、SOAP、XML)
- 平板电脑触控支持
- 缩放功能
何时阅读: 实现计算列、验证规则、查找/替换、序列化或触控支持时。
故障排除
📄 阅读: references/troubleshooting.md
- 常见问题和解决方案
- 性能故障排除
- 数据绑定问题
- UI 渲染问题
- 最佳实践和指南
何时阅读: 调试问题、解决错误或优化实现时。
快速入门示例
以下是一个使用 GridGroupingControl 的最小示例,助你快速上手:
using Syncfusion.Windows.Forms.Grid.Grouping;
using System.Data;
// Create the control
GridGroupingControl gridGroupingControl1 = new GridGroupingControl();
gridGroupingControl1.Dock = DockStyle.Fill;
this.Controls.Add(gridGroupingControl1);
// Create sample data
DataTable dataTable = new DataTable("Employees");
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Department", typeof(string));
dataTable.Columns.Add("Salary", typeof(decimal));
dataTable.Rows.Add(1, "John Smith", "Sales", 50000);
dataTable.Rows.Add(2, "Sarah Jones", "Marketing", 55000);
dataTable.Rows.Add(3, "Mike Wilson", "Sales", 52000);
dataTable.Rows.Add(4, "Lisa Brown", "Marketing", 58000);
dataTable.Rows.Add(5, "Tom Davis", "IT", 65000);
// Bind data source
gridGroupingControl1.DataSource = dataTable;
// Enable grouping with GroupDropArea
gridGroupingControl1.ShowGroupDropArea = true;
// Add a group by Department
gridGroupingControl1.TableDescriptor.GroupedColumns.Add("Department");
// Add a summary to show total salary per group
GridSummaryColumnDescriptor summaryColumn = new GridSummaryColumnDescriptor();
summaryColumn.DataMember = "Salary";
summaryColumn.SummaryType = SummaryType.DoubleAggregate;
summaryColumn.Format = "{Sum:C}";
summaryColumn.Name = "TotalSalary";
GridSummaryRowDescriptor summaryRow = new GridSummaryRowDescriptor();
summaryRow.SummaryColumns.Add(summaryColumn);
gridGroupingControl1.TableDescriptor.SummaryRows.Add(summaryRow);
// Enable sorting
gridGroupingControl1.TableOptions.AllowSortColumns = true;
此示例创建了一个按部门分组并汇总薪资的分组网格。
常见模式
带嵌套表格的主从模式
// Assuming Orders and OrderDetails are related tables in a DataSet
DataSet dataSet = GetOrdersDataSet(); // Your data source
// Bind to parent table
gridGroupingControl1.DataSource = dataSet;
gridGroupingControl1.DataMember = "Orders";
// Nested tables are automatically detected from DataSet relations
// Customize child table appearance
GridRelationDescriptor relation = gridGroupingControl1.TableDescriptor.Relations[0];
relation.ChildTableDescriptor.Appearance.AlternateRecordFieldCell.BackColor = Color.LightBlue;
动态筛选模式
using Syncfusion.GridHelperClasses;
// Wire dynamic filter
GridDynamicFilter dynamicFilter = new GridDynamicFilter();
dynamicFilter.WireGrid(gridGroupingControl1);
// Enable filter bar
gridGroupingControl1.TopLevelGroupOptions.ShowFilterBar = true;
// Enable filtering for specific columns
foreach (GridColumnDescriptor column in gridGroupingControl1.TableDescriptor.Columns)
{
column.AllowFilter = true;
}
类似 Excel 的筛选模式
using Syncfusion.GridHelperClasses;
// Create and wire Excel filter
GridExcelFilter excelFilter = new GridExcelFilter();
excelFilter.AllowSearch = true; // Enable search in filter dropdown
excelFilter.AllowResize = true; // Allow resizing filter popup
excelFilter.EnableNumberFilter = true; // Enable number filters
excelFilter.EnableDateFilter = true; // Enable date filters
excelFilter.AllowFilterByColor = true; // Enable filter by cell color
excelFilter.WireGrid(gridGroupingControl1);
编程式分组模式
// Multi-level grouping
gridGroupingControl1.TableDescriptor.GroupedColumns.Add("Country");
gridGroupingControl1.TableDescriptor.GroupedColumns.Add("City");
// Customize group options
gridGroupingControl1.TopLevelGroupOptions.ShowCaption = true;
gridGroupingControl1.TopLevelGroupOptions.ShowGroupHeader = true;
gridGroupingControl1.TopLevelGroupOptions.ShowGroupFooter = true;
// Customize caption text with tokens
gridGroupingControl1.ChildGroupOptions.CaptionText =
"{CategoryName}: {Category} ({RecordCount} items)";
条件格式模式
// Apply conditional formatting based on cell value
gridGroupingControl1.QueryCellStyleInfo += (sender, e) =>
{
if (e.TableCellIdentity.TableCellType == GridTableCellType.RecordFieldCell)
{
if (e.TableCellIdentity.Column.Name == "Salary")
{
decimal salary = Convert.ToDecimal(e.Style.CellValue);
if (salary > 60000)
{
e.Style.BackColor = Color.LightGreen;
e.Style.Font.Bold = true;
}
else if (salary < 40000)
{
e.Style.BackColor = Color.LightCoral;
}
}
}
};
汇总模式
// Count summary
GridSummaryColumnDescriptor countColumn = new GridSummaryColumnDescriptor(
"Count", SummaryType.Count, "ID", "{Count}");
summaryRow.SummaryColumns.Add(countColumn);
// Average summary
GridSummaryColumnDescriptor avgColumn = new GridSummaryColumnDescriptor(
"Average", SummaryType.DoubleAggregate, "Salary", "Avg: {Average:C}");
summaryRow.SummaryColumns.Add(avgColumn);
// Total summary
GridSummaryColumnDescriptor sumColumn = new GridSummaryColumnDescriptor(
"Total", SummaryType.DoubleAggregate, "Salary", "Total: {Sum:C}");
summaryRow.SummaryColumns.Add(sumColumn);
gridGroupingControl1.TableDescriptor.SummaryRows.Add(summaryRow);
关键属性
核心属性
| 属性 | 类型 | 描述 |
|---|---|---|
DataSource | object | 获取或设置网格的数据源 |
DataMember | string | 获取或设置数据源中的数据成员 |
ShowGroupDropArea | bool | 显示或隐藏用于拖放分组的分组放置区域 |
TableDescriptor | GridTableDescriptor | 提供对表格配置和列的访问 |
TableOptions | GridTableOptionsStyleInfo | 配置表格级选项 |
TopLevelGroupOptions | GridGroupOptionsStyleInfo | 配置顶级分组的选项 |
ChildGroupOptions | GridGroupOptionsStyleInfo | 配置子分组的选项 |
集合属性
| 属性 | 类型 | 描述 |
|---|---|---|
TableDescriptor.GroupedColumns | SortColumnDescriptorCollection | 用于数据分组的列 |
TableDescriptor.SortedColumns | SortColumnDescriptorCollection | 用于数据排序的列 |
TableDescriptor.RecordFilters | RecordFilterDescriptorCollection | 编程式记录筛选器 |
TableDescriptor.SummaryRows | GridSummaryRowDescriptorCollection | 汇总行定义 |
TableDescriptor.Columns | GridColumnDescriptorCollection | 列描述符 |
TableDescriptor.Relations | GridRelationDescriptorCollection | 子表关系 |
关键事件
数据事件
QueryValue- 网格需要检索未绑定单元格值时触发SaveValue- 网格需要保存未绑定单元格值时触发SourceListListChanged- 绑定的数据源发生变化时触发
UI 事件
QueryCellStyleInfo- 动态自定义单元格外观时触发TableControlCellClick- 单击单元格时触发TableControlCellDoubleClick- 双击单元格时触发TableControlCurrentCellActivated- 单元格成为当前单元格时触发
分组事件
GroupExpanding/GroupExpanded- 分组展开时触发GroupCollapsing/GroupCollapsed- 分组折叠时触发GroupedColumns.Changing/Changed- 分组发生变化时触发
排序事件
SortedColumns.Changing/Changed- 排序发生变化时触发TableControlQueryAllowSortColumn- 控制列排序时触发
筛选事件
RecordFilters.Changing/Changed- 筛选器发生变化时触发GridExcelFilter.RecordFiltersItemChanging/Changed- Excel 筛选事件
编辑事件
TableControlCurrentCellStartEditing- 开始编辑单元格时触发TableControlCurrentCellEditingComplete- 完成单元格编辑时触发TableControlCurrentCellValidating- 验证单元格值时触发
常见用例
商业智能仪表板
通过多级分组、下钻功能和汇总摘要,展示复杂数据,用于商业分析和报告。
数据管理应用程序
构建具备主从表单、内联编辑、验证和高级筛选功能的 CRUD 应用程序,用于数据管理。
层次数据可视化
展示组织架构、产品类别或任何层次数据,并支持嵌套分组和可展开分区。
报告应用程序
生成丰富的报告,支持分组、汇总、条件格式设置,并可导出为多种格式(Excel、PDF、Word)。
数据分析工具
实现交互式数据探索,支持动态分组、排序、筛选和汇总计算。
架构说明
引擎架构
GridGroupingControl 使用独特的基于引擎的架构,将数据管理(Engine)与显示(TableControl)分离。这样可以实现:
- 对同一数据提供多个视图
- 高效的数据虚拟化
- 灵活的分组和排序
- 独立处理嵌套表
显示元素
网格将内容组织为以下显示元素:
- Records - 单条数据行
- Groups - 具有相同类别值的记录集合
- CaptionRows - 组标题行
- SummaryRows - 汇总摘要行
- FilterBarCell - 筛选输入单元格
表层次结构
- GridTable - 顶级表实例
- GridNestedTable - 主从关系中的子表
- TopLevelGroup - 包含所有记录的根组
- Groups - 嵌套组集合
最佳实践
- 数据绑定: 使用实现 IBindingList 的强类型集合,以自动通知更改
- 性能: 为大型数据集启用虚拟化(自动处理)
- 分组: 将初始分组级别限制为 2-3 级,以提升用户体验
- 筛选: 使用 GridExcelFilter,提供便于用户使用的筛选体验
- 汇总: 根据使用场景,将汇总策略性地放置在标题或页脚中
- 样式设置: 使用 QueryCellStyleInfo 实现动态样式设置,而不是为所有单元格设置样式
- 事件: 尽量减少 QueryCellStyleInfo 等高频触发事件中的工作
- 内存: 在窗体关闭时妥善释放 GridGroupingControl
相关组件
- GridControl - 用于较简单场景的标准非分组网格
- GridDataBoundGrid - 轻量级数据绑定网格
- DataGrid - 标准 .NET DataGrid 控件
需要分组、汇总和层次结构功能时,请使用 GridGroupingControl。对于基本数据展示,请使用更简单的网格。
文档链接
- 官方文档: https://help.syncfusion.com/windowsforms/gridgrouping/overview
- API 参考: https://help.syncfusion.com/cr/windowsforms/Syncfusion.Windows.Forms.Grid.Grouping.html
- 知识库: https://support.syncfusion.com/kb/windowsforms/gridgrouping
后续步骤: 如需详细的实现指南,请根据需求转到上面的特定参考文件。请从 getting-started.md 开始进行初始设置。