Henry手記:WinForm Datagrid結構剖析(二)程式 (轉)
3.程式碼實現:namespace prefix = o ns = "urn:schemas--com::office" />
WinFoDatagrid結構剖析(二)一文中說了這麼多,最後還是要落於實踐。解決方法何在?簡而言之,就是建立一個能完成DataGridTextBoxColumn類的大部分功能,但擴充套件了cell色彩控制功能的新類,怎麼建立,當然是繼承嘍:
該類的主要作用除了上文所說的過載Paint外,最主要的目標在於如何將的要求(cell的位置,cell的背景色、前景色)儲存下來,在繪製textbox的時候傳遞進Paint中去。實現的方法是用三個集合:一個用於記錄行號(不記錄列號的原因是由於繪製是按列的ColumnStyle儲存的,自動儲存了列號),一個用於記錄背景色,一個用於記錄前景色。請讀者自行閱讀程式碼,如果有什麼問題,可以寫在下方的意見中,或直接發信給to:ruigeren@sina.com?subject=Datagrid讀者">我。
名:CdatagridColor.vb
類名:DataGridColoredTextBoxColumn
------------X從此開始X----------------------------
Imports System..Forms
Public Class DataGridColoredTextBoxColumn
Inherits DataGridTextBoxColumn ‘繼承介面
Public rowcollection As New Collection() '用於存放行號的集合
Public BackColor() As Color '用於存放背景色的集合,與行號集號一致(集合索引減1)
Public ForeColor() As Color '用於存放前景色的集合,索引與行號集號一致
Private Function GetText(ByVal Value As ) As String
'為進行重繪讀出textbox中的內容,這個函式是增加容錯能力的,與實現機制無關
If TypeOf (Value) Is System.Null Then
Return NullText
ElseIf Value Is Nothing Then
Return ""
Else
Return Value.ToString
End If
End Function
Protected Overloads Overrs Sub Paint( _
ByVal g As System.Drawing.Graphics, _
ByVal bounds As System.Drawing.Rectangle, _
ByVal As System.Windows.Forms.CurrencyManager, _
ByVal rowNum As Integer, _
ByVal backBrush As System.Drawing.Brush, _
ByVal foreBrush As System.Drawing.Brush, _
ByVal alignToRight As Boolean)
Dim text As String
'按預設重繪
text = GetText(GetColumnValueAtRow(source, rowNum)) ‘這句就是上文提及的取資料
backBrush = New SolidBrush(TextBox.BackColor) ‘背景色
foreBrush = New SolidBrush(TextBox.ForeColor) ‘前景色
'防止使用者沒有定義集合大小
ReDim Preserve BackColor(rowcollection.Count)
ReDim Preserve ForeColor(rowcollection.Count)
Dim i As Integer = 1 '集合索引從1開始
Do While (i <= rowcollection.Count)
If rowNum = Val(rowcollection.Item(i)) Then ‘判斷要集合中的行數是
If Not BackColor(i - 1).IsEmpty Then '沒有定義的就按預設色繪製
backBrush = New SolidBrush(BackColor(i - 1))
End If
If Not ForeColor(i - 1).IsEmpty Then '沒有定義的就按預設色繪製
foreBrush = New SolidBrush(ForeColor(i - 1))
End If
End If
i += 1
L
MyBase.PaintText(g, bounds, text, backBrush, foreBrush, alignToRight)
End Sub
End Class
--------------------X類到此結束X---------------------------------
下面是我的例子中“變色”按鍵(ID:button2)的程式碼。實現了兩種變色方式:指定位置變色,根據資料來源條件判斷結果來動態變色:
-------------------X程式碼X-----------------------------------------
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button2.Click
Dim dt As DataTable
Dim ts As New DataGridTableStyle()
Dim aColumnTextColumn As DataGridColoredTextBoxColumn '上面自定義的類
dt = DataSet11.Tables("table") ‘Dataset11請自已去定義,或者看一下我的/develop/read_article.?id=15686">前一篇文章
DataGrid1.DataSource = dt ‘資料來源繫結
ts.Mappiame = dt.TableName
Dim numCols As Integer
numCols = DataSet11.Tables("table").Columns.Count ‘統計列數
Dim i, j As Integer
i = 0
j = 0
Do While (i < numCols) '重繪所有的列
aColumnTextColumn = New DataGridColoredTextBoxColumn()
If i = 0 Then
aColumnTextColumn.rowcollection.Add(0) ‘指定行數
aColumnTextColumn.rowcollection.Add(2)
ReDim aColumnTextColumn.ForeColor(aColumnTextColumn.rowcollection.Count)
ReDim aColumnTextColumn.BackColor(aColumnTextColumn.rowcollection.Count)
'不賦值就是預設色,背景為白,前景為黑
aColumnTextColumn.ForeColor(0) = Color.Red
aColumnTextColumn.ForeColor(1) = Color.Blue
aColumnTextColumn.BackColor(0) = Color.Pink
aColumnTextColumn.BackColor(1) = Color.Aqua
End If
If i = 1 Then
For j = 0 To DataSet11.Tables("table").Rows.Count - 1
If DataSet11.Tables("table").Rows(j)(i) > 2 Then ‘判斷列中哪一個cell會大於2
aColumnTextColumn.rowcollection.Add(j)
ReDim ColumnTextColumn.ForeColor(aColumnTextColumn.rowcollection.Count)
ReDim aColumnTextColumn.BackColor(aColumnTextColumn.rowcollection.Count)
aColumnTextColumn.ForeColor(0) = Color.White
aColumnTextColumn.BackColor(0) = Color.Black
End If
Next
End If
'要更改列頭名,請改下句的HeaderText值
aColumnTextColumn.HeaderText = DataSet11.Tables("table").Columns(i).ColumnName
aColumnTextColumn.MapName = DataSet11.Tables("table").Columns(i).ColumnName
ts.GridColumnStyles.Add(aColumnTextColumn)
i = (i + 1)
Loop
DataGrid1.TableStyles.Add(ts)
End Sub
這裡說明一點,判斷時要注意型別的一致,在本例中,第二列的型別是數字型的,所以直接與數字2進行比對大小。
祝福您,下次見!
----
宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。
qq: 18349592
: .com">henry7685@hotmail.com
請訪問本人專欄:http://www.csdn.net/develop/author/netauthor/Latitude/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993780/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Henry手記-VB.net WinForm中的FORM初探(二) (轉)ORM
- Henry手記—.NET資料結構物件補遺之單連結串列(二) (轉)資料結構物件
- .Net WInform開發筆記(二)Winform程式執行結構圖ORM筆記
- 將OleDbDataAdapter繫結到Winform下的DataGrid (轉)APTORM
- Henry手記—使用Template Method設計模式的.NET事件處理機制(二) (轉)設計模式事件
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- ORACLE例項的程式結構和記憶體結構(轉)Oracle記憶體
- Redis 雜湊結構記憶體模型剖析Redis記憶體模型
- Henry手記—使用Template Method設計模式的.NET事件處理機制(一) (轉)設計模式事件
- DirectX學習手記(二) (轉)
- oracle 記憶體結構(二)Oracle記憶體
- 17_buffer_cache記憶體組織結構剖析記憶體
- 第二章 程式結構
- 專案治理結構初探(二)(轉)
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- c# winform程式設計轉例C#ORM程式設計
- jvm系列(二):JVM記憶體結構JVM記憶體
- SQL Server 索引結構及其使用(二)[轉]SQLServer索引
- Winform下的Datagrid的列風格(4)—DataGridComboBoxTableViewColumnORMView
- Go 筆記之程式結構Go筆記
- Python學習手冊之控制結構(二)Python
- 【轉】C# 中 強制退出WinForm程式C#ORM
- Winform引用mshtml程式集的問題 (轉)ORMHTML
- Faiss原始碼剖析:類結構分析AI原始碼
- java-程式的基本結構(java 學習筆記 (1.1)) (轉)Java筆記
- Oracle例項的程式結構和記憶體結構Oracle記憶體
- 程式碼目錄結構記錄
- 《深入剖析Tomcat》讀書筆記(二)Tomcat筆記
- Fastlane(二):結構AST
- 學習筆記:InnoDB表和索引結構(二)筆記索引
- C#資料結構篇(二 堆疊) (轉)C#資料結構
- 二進位制翻轉、結構體指標結構體指標
- 一行Spark程式碼的誕生記(深度剖析Spark架構)Spark架構
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- 資料結構學習筆記(一) (轉)資料結構筆記
- EasyUI 筆記(2)datagrid 使用UI筆記
- Winform 程式多開ORM
- 學JS必看-JavaScript資料結構深度剖析JSJavaScript資料結構