C1FlexGrid控件的主要优势之一就是,具有自定义整个表格和每个个体的单元格外观的几乎任一方面的能力。
如果您是第一次阅读本系列文章,建议您阅读:
- ComponentOne FlexGrid for WinForms 中文版快速入门(1)–开始使用 FlexGrid
- ComponentOne FlexGrid for WinForms 中文版快速入门(2)–设计时支持
- ComponentOne FlexGrid for WinForms 中文版快速入门(3)–单元格、行列交互
为了控制单元格的内容如何被格式化,请将“格式化”属性设置到一个类似于你在.NET framework中通过String.Format方法使用的格式字符串。例如,下面的代码显示了第一列的短日期和第二列的货币值:
· Visual Basic
‘ 短日期。 _flex.Cols(1).Format = “d” ‘ 货币值。 _flex.Cols(2).Format = “c” |
· C#
// 短日期。 _flex.Cols[1].Format = “d”; // 货币值。 _flex.Cols[2].Format = “c”; |
单元格内容的格式也是可以通过使用格式字符串对话框在设计时就进行设置的。格式字符串对话框的访问路径有两种,一种是可通过列任务菜单。另一种是可通过C1FlexGrid列编辑器。
· 在“列任务”菜单上,单击“格式字符串”中的省略号按钮。
· 在C1FlexGrid列编辑器中,在左窗格中找到“格式”属性,并单击它旁边的省略号按钮。
注意:格式字符串对话框是特定列,而且只会更改所选定的列的“格式”属性。
你还是可以使用自定义格式,就像你在Visual Basic “格式”功能中所使用的一样(例如,“#,###”,等等)。
检索单元格数据
你可以使用索引或“获取数据”方法来检索原始的表格数据。要检索格式过的数据,请改为使用GetDataDisplay的方法。例如:
· Visual Basic
‘ 短日期。 _flex.Cols(1).Format = “d” ‘ 货币值。 _flex.Cols(2).Format = “c” _flex(1, 2) = 10000 Console.WriteLine(“Raw value: {0}”, _flex(1, 2)) Console.WriteLine(“Display value: {0}”, _flex.GetDataDisplay(1, 2)) ‘ 行值:10000 |
· C#
// 短日期。 _flex.Cols[1].Format = “d”; // 货币值。 _flex.Cols[2].Format = “c”; _flex[1, 2] = 10000; Console.WriteLine(“Raw value: {0}”, _flex[1, 2]); Console.WriteLine(“Display value: {0}”, _flex.GetDataDisplay(1, 2)); // 行值:10000 |
单元格的外观(对齐方式、字体、颜色、边框,等)是由“单元格样式”对象处理的。表格有一个“样式”属性,它包含了用于设置单元格格式的所有样式的集合。这个集合有一些可以定义表格元素的外观的内置成员,如固定的和滚动的单元格,单元格选择,单元格定焦,等等。你可以更改这些样式来修改表格的外观,你也可以创建自己的自定义样式,并将它们分配给单元格,行或列。
改变内置的样式是改变表格外观的最简单的方式。例如,下面的代码可以将所选定的部分的背景显示为红色,字体为绿色粗体:
· Visual Basic
Dim cs As CellStyle = _flex.Styles.Highlight cs.Font = New Font(_flex.Font, FontStyle.Bold) cs.ForeColor = Color.Green cs.BackColor = Color.Red |
· C#
CellStyle cs = _flex.Styles.Highlight; cs.Font = new Font(_flex.Font, FontStyle.Bold); cs.ForeColor = Color.Green; cs.BackColor = Color.Red; |
你还可以创建你自己的样式,并将它们分配到单元格,行和列。例如,下面的代码可以创建一个自定义单元格样式并把它分配给每一个第五行:
· Visual Basic
Dim cs As CellStyle = _flex.Styles.Add(“Fifth”) cs.BackColor = Color.Gray Dim idex% For idex = _flex.Rows.Fixed To _flex.Rows.Count – 1 Step 5 _flex.Rows(idex).Style = cs Next |
· C#
CellStyle cs = _flex.Styles.Add(“Fifth”); cs.BackColor = Color.Gray; for (int index = _flex.Rows.Fixed ; index <= _flex.Rows.Count – 1; index += 5) { _flex.Rows[index].Style = cs; |
下面是一个例子,显示了如何创建自定义样式,并将它们分配到行,列和单元格区域:
· Visual Basic
‘ 创建一个新的自定义样式。 Dim s As CellStyle = _flex.Styles.Add(“MyStyle”) s.BackColor = Color.Red s.ForeColor = Color.White ‘ 将新的样式分配到一列。 _flex.Cols(3).Style = _flex.Styles(“MyStyle”) ‘ 将新的样式分配到一行。 _flex.Rows(3).Style = _flex.Styles(“MyStyle”) ‘ 将新的样式分配到一个单元格区域。 Dim rg As CellRange = _flex.GetCellRange(4, 4, 6, 6) rg.Style = _flex.Styles(“MyStyle”) |
· C#
// 创建一个新的自定义样式。 CellStyle s = _flex.Styles.Add(“MyStyle”); s.BackColor = Color.Red; s.ForeColor = Color.White; // 将新的样式分配到一列。 _flex.Cols[3].Style = _flex.Styles[“MyStyle”]; // 将新的样式分配到一行。 _flex.Rows[3].Style = _flex.Styles[“MyStyle”]; // 将新的样式分配到一个单元格区域。 CellRange rg = _flex.GetCellRange(4,4,6,6); rg.Style = _flex.Styles[“MyStyle”]; |
只要你愿意,你就可以在设计时使用C1FlexGrid样式编辑器来设置好样式,而不是靠编写代码来执行这一步操作。有关如何使用C1FlexGrid样式编辑器来自定义单元格的外观的更多详细信息,请参阅“C1FlexGrid样式编辑器” (第27页)。
要根据单元格的内容设置其格式,你可以基于其内容使用“单元格变更”事件来为单元格选择一种样式。例如,下面的代码可以根据单元格的内容为“大货币值”创建一个新的样式,并将其应用于单元格:
· Visual Basic
Dim cs As C1.Win.C1FlexGrid.CellStyle Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ‘ 为“大货币值”创建一个自定义样式。 cs = _flex.Styles.Add(“LargeValue”) cs.Font = New Font(Font, FontStyle.Italic) cs.BackColor = Color.Gold End Sub ‘ 根据单元格的内容来设置其格式。 Private Sub _flex_CellChanged(ByVal sender As Object, ByVal e As RowColEventArgs) Handles _flex.CellChanged ‘ 将货币值大于50,000的标记为“大货币值”(通过将“样式”设置为“无”来重新设置其他的)。 Dim cs As CellStyle If _flex(e.Row, e.Col).ToString >= 50000 Then cs = _flex.Styles(“LargeValue”) _flex.SetCellStyle(e.Row, e.Col, cs) End If |
· C#
CellStyle cs; private void Form1_Load(object sender, EventArgs e) { // 为大货币值创建一个自定义样式。 cs = _flex.Styles.Add(“LargeValue”); cs.Font = new Font(Font, FontStyle.Italic); cs.BackColor = Color.Gold; } // 根据单元格的内容来设置其格式。 private void _flex_CellChanged( object sender, RowColEventArgs e) { // 将货币值大于50,000的标记为“大货币值”(通过将“样式”设置为“无”来重新设置其他的)。 if (Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(_flex[e.Row, e.Col].ToString()) >= 50000) { cs = _flex.Styles[“LargeValue”]; _flex.SetCellStyle(e.Row, e.Col, cs); } |
即使 “单元格样式”对象已经通过单元格外观(背景色和前景色、对齐方式、字体、边距、边框,等等)提供了很多控件,有时这仍是不够的。你可能想使用渐变背景,或直接在单元格中画一些自定义的图形。在这些情况下,你可以使用“绘制模式”属性和“自绘单元格”事件,通过每一个单元格是如何绘制的来实现全面控制。
“绘制模式”属性决定了 “自绘单元格”事件是否被激发。该事件可以是你兼顾到每一个单元格的视觉效果。“自绘单元格”事件中的参数,允许你对所显示的数据以及用于显示数据的样式,做出更改,甚至允许你完全接管并绘制单元格中你所想要的任何东西。
你可以通过在事件处理程序中设置e.Text和e.Image参数,来改变即将显示在单元格中的文本和图像。你也可以通过设置e.Style属性来改变将用于显示单元格的样式。请注意,你不应该修改样式参数的属性,因为这可能会影响到其他单元格。相反,你要分配一个新的“单元格样式”对象到“样式”参数。例如,不要设置e.Style.ForeColor= Color.Red,而应该通过使用e.Style = _flex.Styles[“RedStyle”]将一个全新的样式分配给参数。
你还可以使用自己的绘图代码在单元格中进行绘制,甚至用命令将你的自定义代码与e.DrawCell方法合并到一起。例如,你可以使用GDI命令来绘制单元格的背景,然后调用e.DrawCell来显示单元格边框和内容。
可用的示例项目
有关高级的自绘单元格的一个范例,请参阅“ComponentOne 帮助中心”的RtfGrid样品。
下面的代码显示了一个例子。它使用了渐变画笔来绘制所选定的单元格的背景。首先,代码会设置“绘制模式”属性,显示一个“线性渐变画笔”的对象并且在表格重新调整大小时更新画笔:
· Visual Basic
Dim m_GradientBrush As System.Drawing.Drawing2D.LinearGradientBrush Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ‘ 通过自绘单元格来使用画笔。 m_GradientBrush = New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45) ‘ 使用自绘来添加渐变。 _flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub _flex_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles _flex.Resize ‘ 当控件调整大小时更新渐变画笔。 m_GradientBrush = New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45) End Sub |
· C#
System.Drawing.Drawing2D.LinearGradientBrush m_GradientBrush; private void Form1_Load(object sender, EventArgs e) { // 通过自绘单元格来使用画笔。 m_GradientBrush = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45); // 使用自绘来添加渐变。 _flex.DrawMode = DrawModeEnum.OwnerDraw; } private void _flex_Resize( object sender, System.EventArgs e) { // 当控件调整大小时更新渐变画笔。 m_GradientBrush = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45); } |
第二步是处理“自绘单元格”事件,并使用自定义画刷来绘制单元格的背景。在这个例子中,通过在事件参数中使用 “绘制单元格”方法,表格自己处理了自己的前景:
· Visual Basic
Private Sub _flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles _flex.OwnerDrawCell ‘ 使用渐变画笔来绘制所选定的单元格的背景。 If _flex.Selection.Contains(e.Row, e.Col) Then ‘ 绘制背景。 e.Graphics.FillRectangle(m_GradientBrush, e.Bounds) ‘ 让表格绘制其内容。 e.DrawCell(C1.Win.C1FlexGrid.DrawCellFlags.Content) ‘ 我们已完成这个单元格的绘制。 e.Handled = True End If |
· C#
private void _flex_OwnerDrawCell( object sender, OwnerDrawCellEventArgs e) { // 使用渐变画笔来绘制所选定的单元格的背景。 if (_flex.Selection.Contains(e.Row, e.Col)) { // 绘制背景。 e.Graphics.FillRectangle(m_GradientBrush, e.Bounds); // 让表格绘制其内容。 e.DrawCell(DrawCellFlags.Content); // 我们已完成这个单元格的绘制。 e.Handled = true; } |
转载于:https://www.cnblogs.com/C1SupportTeam/archive/2012/12/11/2812324.html