DevExpress WinForms中文教程:Grid View - 如何实现单元格合并?
DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
DevExpress WinForms网格控件可以垂直合并单元格,从而为具有许多重复值的视图提供更清晰的数据表示。在本教程中,您将学习如何为整个视图或单个列启用单元格合并功能,还将看到如何更改确定是否合并两个相邻单元格的算法。
获取DevExpress WinForms v24.2正式版下载
DevExpress技术交流群11:749942875 欢迎一起进群讨论
起点
从一个以常规格式显示数据的网格控件开始。

启用单元格合并
在设计时,访问视图的属性,然后展开GridView.OptionsView并启用GridOptionsView.AllowCellMerge选项。

由于网格没有为单元格合并提供默认UI,因此可以创建一个按钮处理程序,在运行时切换相同的选项。
C#
private barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) { gridView1.OptionsView.AllowCellMerge = !gridView1.OptionsView.AllowCellMerge; }
运行应用程序,注意具有相同值的列单元格被合并,单击该按钮可查看启用或禁用单元格合并时布局的变化情况。

请注意,可以通过对具有重复值的列进行排序来启用更具可读性的视图。这将相同的值放在一起,因此视图将更大的数据块连接到合并的单元格中。

禁用单个列的单元格合并
现在选择Priority列来访问它的属性,展开GridColumn.OptionsColumn,然后禁用OptionsColumn.AllowMerge选项。

运行应用程序,查看优先级单元格不再合并,而其他列仍然启用了该特性。

实现自定义单元格合并算法
现在您可以注意到,Created By列中的电子邮件地址具有重复的域。您可以更改单元格合并算法,以便将具有相同域的所有单元格合并在一起。
选择网格视图并访问其事件来编写ColumnView.CustomColumnDisplayText处理程序,代码检查是否正在处理Created By列。单元格显示文本(或电子邮件地址)从CustomColumnDisplayTextEventArgs.DisplayText参数获得,处理程序然后检索带有域名的子字符串,并将其分配回CustomColumnDisplayTextEventArgs.DisplayText。
C#
private void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column == colCreatorID) { string email = e.DisplayText; string domain = email.Substring(email.IndexOf('@') + 1); e.DisplayText = domain; } }
运行应用程序,您将看到域名显示在单元格中,但没有发生合并,因为该特性仍然依赖于单元格值而不是显示文本。

为了解决这个问题,编写一个GridView.CellMerge事件处理程序。首先,检查正在处理的列是否正确。然后,获取正在比较的两个单元格的显示文本。最后,指示如果单元格的显示文本匹配,则合并单元格。将CellMergeEventArgs.Handled参数设置为true,以覆盖网格对该列的默认处理。
C#
using DevExpress.XtraGrid.Views.Grid; // ... private void gridView1_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e) { GridView view = sender as GridView; if(view == null) return; if (e.Column == colCreatorID) { string text1 = view.GetRowCellDisplayText(e.RowHandle1, colCreatorID); string text2 = view.GetRowCellDisplayText(e.RowHandle2, colCreatorID); e.Merge = (text1 == text2); e.Handled = true; } }
现在运行应用程序,查看是否正在根据域信息合并单元格。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-02-11 「B/S端开发」DevExtreme初级入门教程 - ASP.NET MVC 5控件简介
2022-02-11 界面组件Telerik UI for WPF入门级教程 - 编辑控件模板(一)
2018-02-11 DevExpress使用教程:XtraGridControl动态添加右键菜单