ComponentOne FlexGrid for WinForms 中文版快速入门(6)—合并单元格
合并单元格
C1FlexGrid控件允许你合并单元格,使他们跨越多个行或列。这个功能可以用来增强在表格上显示的数据的外观和清晰度。这些设置的作用与HTML<ROWSPAN>和<COLSPAN>标签类似。
如果您是第一次阅读本系列文章,建议您阅读:
- ComponentOne FlexGrid for WinForms 中文版快速入门(1)--开始使用 FlexGrid
- ComponentOne FlexGrid for WinForms 中文版快速入门(2)--设计时支持
- ComponentOne FlexGrid for WinForms 中文版快速入门(3)--单元格、行列交互
- ComponentOne FlexGrid for WinForms 中文版快速入门(4)--设置单元格格式
- ComponentOne FlexGrid for WinForms 中文版快速入门(5)--设置单元格类型(上)
- ComponentOne FlexGrid for WinForms 中文版快速入门(5)--设置单元格类型(下)
1.1
若要使单元格能够合并,以下两件事你必须要做:
1. 将表格 “允许合并”属性设置为“无”以外的任何值。(每个设置的效果都会在参考部分得到解释。)
2. 如果你想要合并列,必须将你想合并的每一列的“允许合并”属性设置为“真”。如果你想要合并行,必须将你想合并的每一行的“允许合并”属性设置为“真”。
如果相邻的单元格中含有相同的非空字符串,合并就会发生。没有一种方法能迫使一对单元格合并到一起。合并会在单元格内容的基础上自动完成。当相邻行中的值呈现重复数据的时候,这可以很容易地提供排序数据的合并后的视图。
单元格合并有几种可能的用途。例如,当文本溢出到相邻列时,你可以用它来创建合并的表头,合并后的数据视图,或表格。
1.1.1 合并表头
要创建合并表头,你必须通过将表格的“允许合并”属性设置到FixedOnly来启动。然后,通过设置行和列的“允许合并”属性来指定要合并的行和列。最后,将文本分配到标题单元格,以便你要合并的单元格具有相同的内容。
下面的代码显示了一个例子:
· Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i% ' 初始化该控件。 _flex.Styles.Normal.WordWrap = True _flex.Cols.Count = 9 _flex.Rows.Fixed = 2 _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.FixedOnly '创建行标题。 _flex.Rows(0).AllowMerging = True '合并含有相同内容的四个单元格。 Dim rng As C1.Win.C1FlexGrid.CellRange = _flex.GetCellRange(0, 1, 0, 4) rng.Data = "North" '合并含有相同内容的四个单元格。 rng = _flex.GetCellRange(0, 5, 0, 8) rng.Data = "South" For i = 1 To 4 _flex(1, i) = "Qtr " & i _flex(1, i + 4) = "Qtr " & i Next '创建列标题。 _flex.Cols(0).AllowMerging = True '合并含有相同的内容的两个单元格。 rng = _flex.GetCellRange(0, 0, 1, 0) rng.Data = "Sales by Product" '对齐单元格和自动调整单元格大小。 _flex.Styles.Fixed.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter _flex.AutoSizeCols(1, _flex.Cols.Count - 1, 10) |
· C#
private void Form1_Load(System.object sender, System.EventArgs e) { int i; // 初始化该控件。 _flex.Styles.Normal.WordWrap = true; _flex.Cols.Count = 9; _flex.Rows.Fixed = 2; _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.FixedOnly; //创建行标题。 _flex.Rows[0].AllowMerging = true; //合并含有相同内容的四个单元格。 C1.Win.C1FlexGrid.CellRange rng = _flex.GetCellRange(0, 1, 0, 4); rng.Data = "North"; //合并含有相同内容的四个单元格。 rng = _flex.GetCellRange(0, 5, 0, 8); rng.Data = "South"; for ( i = 1 ; i <= 4; i++) { _flex[1, i] = "Qtr " + i; _flex[1, i + 4] = "Qtr " + i; } //创建列标题。 _flex.Cols[0].AllowMerging = true; //合并含有相同的内容的两个单元格。 rng = _flex.GetCellRange(0, 0, 1, 0); rng.Data = "Sales by Product"; //对齐单元格和自动调整单元格大小。 _flex.Styles.Fixed.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; _flex.AutoSizeCols(1, _flex.Cols.Count - 1, 10); } |
以下是结果:
1.1.2 合并后的数据视图
当表格被绑定到一个数据源时,单元格合并会以同样的方式进行。下面的代码显示了一个在设计时表格绑定到数据源的例子。有关绑定到一个数据源的更多详细信息,请参阅“绑定到一个数据源”(第95页)。
· Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i% '设置单元格合并。 _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols For i = _flex.Cols.Fixed To _flex.Cols.Count - 1 _flex.Cols(i).AllowMerging = True Next End Sub |
· C#
private void Form1_Load( System.object sender, System.EventArgs e) { int i; //设置单元格合并。 _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols; for (int i = _flex.Cols.Fixed; i <= _flex.Cols.Count - 1; i++) { _flex.Cols(i).AllowMerging = true; } |
以下是结果:
请注意合并单元格是如何在分组数据和使表格中的信息更容易理解上具有视觉效果的。
可用 的示例项目
有关合并后数据视图用C1FlexGrid显示的一个示例,请参阅ComponentOne 帮助中心中的“单元格合并”样本。
1.1.3 溢出文本
“允许合并”属性有两个设置,它们不同于其他的操作,也不需要你在特定的行和列来设置“允许合并”属性。
溢出设置
溢出设置会导致太长而不适合于一个单元格的文本蔓延到相邻的空单元格中。这种结果式的行为与Microsoft Excel中的类似。如果你在一个单元格中键入一个长项而相邻的单元格是空的,则该项可能会溢出所在单元格来占据所需要的尽可能多的空间。
例如,下面的图片显示了当“允许合并”属性设置为“溢出”且用户输入了不同长度的条目时,一个表格看起来是什么样子的:
节点设置
节点设置是与“溢出”类似,但只适用于勾勒节点。当数据被组合成组,且在节点行中所包含的格式中的信息与数据行不同时,此设置是非常有用的。
例如,下面的图片显示了,当数据被用C1FlexGridBase.Subtotal方法分组和总结,随后节点被设置为“允许合并”时,一个表格看起来是什么样子的:
此图片与在“创建汇总”(第67页)主题中的那个类似。所不同的是,现在小计行(节点)溢出到相邻的空单元格,改善了表格的外观。
1.1.4 自定义合并
你可以通过两种途径自定义默认的合并行为:
· 将一个自定义的IComparer类分配到CustomComparer属性。
默认情况下,表格会将包含相同的非空值的相邻的单元格合并到一起。字符串比较是区分大小写的,且包括空白。
如果你想让表格用大小不敏感的比较和修剪空白来合并单元格,你可以写一个自定义的类,用它来实现Icomparer,并且将它分配到CustomComparer属性。
· 写一个从C1FlexGrid派生出的新类别,并通过提供自己的自定义合并逻辑来覆盖GetMergedRange虚拟方法。
可用的示例项目
有关可以显示如何实现自定义的合并逻辑的样本,请参阅如下样本,“ComponentOne 帮助中心”的“自定义合并”,“自定义合并2”,“自定义合并3”,“自定义合并4”。