VB.NET中关于DataGrid颜色的自定义。

近来项目用到了一个类似 WEB 控件 DataGrid 中自定义行或列的颜色的功能,然而应用却是在 WIN 的窗体下,实现起来无法使用类似 JavaScript 的脚本注册的功能来动态完成,十分着急,察看了 CSDN 的一些关于 WinForm 下的关于 DataGrid 的资料,看到这样的一篇介绍 DG 结构的美文,题目是《 ** Henry ** ** 手记 ** ** :WinForm Datagrid ** ** 结构剖析 ** 》,作者是 韩睿( Latitude ) ,其中介绍了 WIN DG 的颜色的定义,但是主要是针对每一个 Cell 的。

我们需要的则是标记某一行的数据,用颜色突出显示,所以作了部分改动,现在把部分代码张贴出来供大家参考:

1. 基础类出自 韩睿 :

URL: http://www.csdn.net/develop/read_article.asp?id=15686

Public Class DataGridColoredTextBoxColumn

Inherits DataGridTextBoxColumn

Public rowcollection As New Collection()

Public BackColor() As Color

Public ForeColor() As Color

Private Function GetText( ByVal Value As Object ) As String

If TypeOf (Value) Is System.DBNull Then

Return NullText

ElseIf Value Is Nothing Then

Return ""

Else

Return Value.ToString

End If

End Function

Protected Overloads Overrides Sub Paint( ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, _

ByVal source 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

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

Loop

MyBase .PaintText(g, bounds, text, backBrush, foreBrush, alignToRight)

End Sub

End Class

2. 关于行颜色定义的类:

Imports System.Windows.Forms

Namespace Truck_WEB

Public Class DrawDGClass

Public Class ReDrawDataDridControls : Inherits DataGridColoredTextBoxColumn

Public Sub DrawCorol( ByRef DG As DataGrid, Optional ByVal CurrentRowindex As Integer = 0)

'设置选中的行的颜色,默认是第一行选中。

Dim dt As DataTable

Dim ts As New DataGridTableStyle()

ts.AllowSorting = False

Dim aColumnTextColumn As DataGridColoredTextBoxColumn

dt = CType (DG.DataSource, DataTable)

ts.MappingName = CType (DG.DataSource, DataTable).TableName

DG.TableStyles.Clear()

Dim numCols As Integer

numCols = dt.Columns.Count

Dim i, j As Integer

i = 0

j = 0

Do While (i < numCols)

aColumnTextColumn = New DataGridColoredTextBoxColumn()

Dim rowindex As Integer = 0

For rowindex = 0 To dt.Rows.Count - 1

Dim StrSel As String

Dim MyForeCorol, MyBackCorol As Color

aColumnTextColumn.rowcollection.Add(rowindex)

If rowindex = CurrentRowindex Then

MyForeCorol = Color.White

MyBackCorol = Color.DarkSlateBlue

else

MyForeCorol = Color.DarkSlateBlue

MyBackCorol = Color.White

End If

ReDim Preserve aColumnTextColumn.ForeColor(aColumnTextColumn.rowcollection.Count)

ReDim Preserve aColumnTextColumn.BackColor(aColumnTextColumn.rowcollection.Count)

aColumnTextColumn.ForeColor(rowindex) = MyForeCorol

aColumnTextColumn.BackColor(rowindex) = MyBackCorol

Next

'要更改列头名,请改下句的HeaderText值

aColumnTextColumn.HeaderText = dt.Columns(i).ColumnName

aColumnTextColumn.MappingName = dt.Columns(i).ColumnName

ts.GridColumnStyles.Add(aColumnTextColumn)

i = (i + 1)

Loop

DG.TableStyles.Add(ts)

End Sub

End Class

End Class

End Namespace

以上是设定选中单行的颜色为反色,各位还可以借题发挥一下!例如设置颜色,等等。

在此向《 ** Henry ** ** 手记 ** ** :WinForm Datagrid ** ** 结构剖析 ** 》的作者 韩睿致谢!

以后我会尽量完善这个 DrawDG 的类,为大家提供方便!

Published At
Categories with Web编程
Tagged with
comments powered by Disqus