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; } |