XtraGrid 3 推出了单元格合并功能,允许合并邻近的有相同取值的单元格。 这为用户提供了查看屏幕信息的可选择的方式。 下面的插图展示了启用单元格合并功能的网格视图。
概述
只有 网格视图 和 带区网格视图 支持单元格合并功能。 在默认情况下,禁用了此功能。 要启用此功能,则把视图的 GridOptionsView.AllowCellMerge 选项设置为 true。 可以通过 GridView.OptionsView 属性访问此选项。 当视图的单元格合并机制被启用时,如果需要,仍然可以阻止个别列的单元格被合并。 要达到此目的,则把所需列的 OptionsColumn.AllowMerge 选项设置为 false。
AdvBandedGridView 视图不支持单元格合并功能,因为这种视图允许列单元格被排列在几行中。 这样,属于同一个列的单元格可能不相邻。 如果需要有带区和单元格合并功能,则使用 BandedGridView 视图来代替。
当单元格合并功能被激活时,对视图有下列限制:
- 不能编辑已合并单元格的取值;
- 不能选中多行;
- 当打印或导出网格控件时,单元格合并功能不影响网格控件的外观与感觉;
- 已合并行不能显示 预览区。 如果 GridOptionsView.ShowPreview 选项设置为 true,则不能合并相邻的有相同取值的单元格,不管 GridOptionsView.AllowCellMerge 属性的取值如何。
- 用于绘制当前获得焦点行的外观设置不被采用 (GridViewAppearances.FocusedRow 属性);
- 用于绘制偶数行和奇数行的外观设置不被采用 (GridViewAppearances.EvenRow 和 GridViewAppearances.OddRow 属性)。
通过代码合并单元格
通过接管 GridView.CellMerge 事件,也可以控制如何合并单元格,此事件允许人工定制单元格合并行为。 在默认情况下,在已合并单元格中显示位于合并区域顶部的单元格的取值,即使是被合并单元格中的实际取值不同。 在这种情况下,也可以接管 GridView.CustomDrawCell 或 ColumnView.CustomColumnDisplayText 事件来提供被合并单元格的显示值。
下面的示例代码接管了 GridView.CellMerge 事件,合并在 Balance 列中有相同符号的单元格。 接管了 GridView.CustomDrawCell 事件,为被合并单元格提供适当的显示文本。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid using DevExpress.XtraGrid.Views.Base private void gridView1_CellMerge(object sender, CellMergeEventArgs e) { if(e.Column != gridView1.Columns["Balance"]) return; int value1 = Convert.ToInt32(gridView1.GetRowCellValue(e.RowHandle1, e.Column)); int value2 = Convert.ToInt32(gridView1.GetRowCellValue(e.RowHandle2, e.Column)); if(Math.Sign(value1) == Math.Sign(value2)) { e.Merge = true; e.Handled = true; } } private void gridView1_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e) { if(e.Column != gridView1.Columns["Balance"]) return; switch(Math.Sign(Convert.ToInt32(e.CellValue))) { case -1: e.DisplayText = "Negative"; break; case 0: e.DisplayText = "Zero"; break; case 1: e.DisplayText = "Positive"; break; default: break; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Views.Base Private Sub GridView1_CellMerge(ByVal sender As Object, ByVal e As CellMergeEventArgs) _ Handles GridView1.CellMerge If Not e.Column Is GridView1.Columns("Balance") Then Exit Sub End If Dim value1 As Integer = Convert.ToInt32(GridView1.GetRowCellValue(e.RowHandle1, e.Column)) Dim value2 As Integer = Convert.ToInt32(GridView1.GetRowCellValue(e.RowHandle2, e.Column)) If Math.Sign(value1) = Math.Sign(value2) Then e.Merge = True e.Handled = True End If End Sub Private Sub GridView1_CustomDrawCell(ByVal sender As Object, _ ByVal e As RowCellCustomDrawEventArgs) _ Handles GridView1.CustomDrawCell If Not GridView1.OptionsView.AllowCellMerge Then Exit Sub End If If Not e.Column Is GridView1.Columns("Balance") Then Return End If Select Case Math.Sign(Convert.ToInt32(e.CellValue)) Case -1 e.DisplayText = "Negative" Case 0 e.DisplayText = "Zero" Case 1 e.DisplayText = "Positive" Case Else End Select End Sub |
下面的插图展示了运行结果。