Imports System
Imports System.Drawing
Imports System.Collections
Imports System.Windows.Forms
Imports System.Reflection
Imports System.Data
'****Chage back color of data grid*************
Namespace TEST
Public Class Colorrow
Implements IDisposable
Private m_grid As DataGrid
Private m_r As Object
Private arrClr() As Color = {Color.White, Color.LightYellow}
Private brCell As SolidBrush
Private m_fiRowVisibleFirst, m_fiRowVisibleLast As FieldInfo
Private m_fiRowDrawFirst, m_fiRowDrawLast As FieldInfo
Private m_miDrawCells As MethodInfo
Private preRow As Integer = 0
Private iRowVisibleFirst, iRowVisibleLast As Integer
Public Sub New(ByVal grid As DataGrid)
m_grid = grid
HookGrid()
End Sub
Private Sub HookGrid()
If m_grid Is Nothing Then
MsgBox("No Records to Display", MsgBoxStyle.Information)
Return
Else
m_r = GetType(DataGrid).GetField("m_renderer", BindingFlags.NonPublic
Or BindingFlags.GetField Or BindingFlags.Instance).GetValue(m_grid)
m_fiRowDrawFirst = m_r.GetType().GetField("m_irowDrawFirst",
BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance)
m_fiRowDrawLast = m_r.GetType().GetField("m_irowDrawLast",
BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance)
m_fiRowVisibleFirst = GetType(DataGrid).GetField("m_irowVisibleFirst",
BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance)
m_fiRowVisibleLast = GetType(DataGrid).GetField("m_irowVisibleLast",
BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance)
m_miDrawCells = m_r.GetType().GetMethod("_DrawCells",
BindingFlags.NonPublic Or BindingFlags.Instance)
brCell = CType(m_r.GetType().GetField("m_brushCellBack",
BindingFlags.NonPublic Or BindingFlags.GetField Or
BindingFlags.Instance).GetValue(m_r), SolidBrush)
Dim vsb As VScrollBar = CType(GetType(DataGrid).GetField("m_sbVert",
BindingFlags.NonPublic Or BindingFlags.GetField Or
BindingFlags.Instance).GetValue(m_grid), VScrollBar)
Dim hsb As HScrollBar = CType(GetType(DataGrid).GetField("m_sbHorz",
BindingFlags.NonPublic Or BindingFlags.GetField Or
BindingFlags.Instance).GetValue(m_grid), HScrollBar)
AddHandler vsb.ValueChanged, AddressOf vsb_ValueChanged
AddHandler hsb.ValueChanged, AddressOf hsb_ValueChanged
AddHandler m_grid.Paint, AddressOf grid_Paint
AddHandler m_grid.CurrentCellChanged, AddressOf grid_CurrentCellChanged
iRowVisibleFirst = CInt(Fix(m_fiRowVisibleFirst.GetValue(m_grid)))
iRowVisibleLast = CInt(Fix(m_fiRowVisibleLast.GetValue(m_grid)))
End If
End Sub
Private Sub UnhookGrid()
If m_grid Is Nothing Then
Return
End If
Dim vsb As VScrollBar = CType(GetType(DataGrid).GetField("m_sbVert",
BindingFlags.NonPublic Or BindingFlags.GetField Or
BindingFlags.Instance).GetValue(m_grid), VScrollBar)
Dim hsb As HScrollBar = CType(GetType(DataGrid).GetField("m_sbHorz",
BindingFlags.NonPublic Or BindingFlags.GetField Or
BindingFlags.Instance).GetValue(m_grid), HScrollBar)
RemoveHandler vsb.ValueChanged, AddressOf vsb_ValueChanged
RemoveHandler hsb.ValueChanged, AddressOf hsb_ValueChanged
RemoveHandler m_grid.Paint, AddressOf grid_Paint
RemoveHandler m_grid.CurrentCellChanged, AddressOf grid_CurrentCellChanged
End Sub
Public Property AcceptRowColor() As Color
Get
Return arrClr(0)
End Get
Set(ByVal value As Color)
arrClr(0) = value
End Set
End Property
Public Property NonAcceptRowColor() As Color
Get
Return arrClr(1)
End Get
Set(ByVal value As Color)
arrClr(1) = value
End Set
End Property
Private Sub ForceRepaintGridRow(ByVal g As Graphics, ByVal row As Integer)
Dim o As Object = m_grid(row, 5)
Dim value As String = CType(o, String)
value = value.Substring(0, 6) 'sould change to Substring(0, 6)
If value.Equals("Days 0") Then 'sould change to "Days 0"
brCell.Color = arrClr(1)
m_fiRowDrawFirst.SetValue(m_r, row)
m_fiRowDrawLast.SetValue(m_r, row)
m_miDrawCells.Invoke(m_r, New Object() {g})
Else
brCell.Color = arrClr(0)
'brCellFore.Color = arrClrText[1]
m_fiRowDrawFirst.SetValue(m_r, row)
m_fiRowDrawLast.SetValue(m_r, row)
m_miDrawCells.Invoke(m_r, New Object() {g})
End If
End Sub
Private Sub ForceRepaintGridRows(ByVal g As Graphics, ByVal rowStart As
Integer, ByVal rowEnd As Integer)
Dim i As Integer
Dim o As Object
Dim value As String
For i = rowStart To rowEnd
o = m_grid(i, 5)
value = CType(o, String)
value = value.Substring(0, 6) 'sould change to Substring(0, 6)
If value.Equals("Days 0") Then 'sould change to "Days 0"
brCell.Color = arrClr(1)
'brCellFore.Color = arrClrText[0]
m_fiRowDrawFirst.SetValue(m_r, i)
m_fiRowDrawLast.SetValue(m_r, i)
m_miDrawCells.Invoke(m_r, New Object() {g})
'MsgBox(value)
'MsgBox("Light Blue")
Else
brCell.Color = arrClr(0)
'brCellFore.Color = arrClrText[1]
m_fiRowDrawFirst.SetValue(m_r, i)
m_fiRowDrawLast.SetValue(m_r, i)
m_miDrawCells.Invoke(m_r, New Object() {g})
End If
Next i
End Sub
Private Sub vsb_ValueChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim iRowFirst As Integer = CInt(Fix(m_fiRowVisibleFirst.GetValue(m_grid)))
Dim iRowLast As Integer = CInt(Fix(m_fiRowVisibleLast.GetValue(m_grid)))
Dim g As Graphics = m_grid.CreateGraphics()
If iRowVisibleFirst > iRowFirst Then 'Scroll Up
ForceRepaintGridRows(g, iRowFirst, iRowVisibleFirst)
Else
ForceRepaintGridRows(g, iRowVisibleLast, iRowLast)
End If
iRowVisibleFirst = iRowFirst
iRowVisibleLast = iRowLast
End Sub
Private Sub hsb_ValueChanged(ByVal sender As Object, ByVal e As EventArgs)
grid_Paint(Nothing, Nothing)
End Sub
#Region "IDisposable Members"
Public Sub Dispose() Implements IDisposable.Dispose
UnhookGrid()
End Sub
#End Region
Private Sub grid_Paint(ByVal sender As Object, ByVal e As PaintEventArgs)
Dim rowFirst, rowLast As Integer
rowFirst = CInt(Fix(m_fiRowVisibleFirst.GetValue(m_grid)))
rowLast = CInt(Fix(m_fiRowVisibleLast.GetValue(m_grid)))
rowFirst = Math.Max(rowFirst, 0)
rowLast = Math.Max(rowLast, 0)
Dim cl As Color = brCell.Color
' Color clText = brCellFore.Color;
Dim g As Graphics
g = m_grid.CreateGraphics()
ForceRepaintGridRows(g, rowFirst, rowLast)
brCell.Color = cl
' brCellFore.Color = clText;
End Sub
Private Sub grid_CurrentCellChanged(ByVal sender As Object, ByVal e As
EventArgs)
Dim g As Graphics
g = m_grid.CreateGraphics()
If m_grid.CurrentCell.RowNumber > -1 Then
ForceRepaintGridRow(g, m_grid.CurrentCell.RowNumber)
If preRow > -1 Then
ForceRepaintGridRow(g, preRow)
End If
preRow = m_grid.CurrentCell.RowNumber
End If
End Sub
End Class
End Namespace

