Henry手記:WinForm Datagrid結構剖析(二)程式 (轉)

worldblog發表於2007-12-15
Henry手記:WinForm Datagrid結構剖析(二)程式 (轉)[@more@]

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章