There are a couple of issues with your code.
First, you are handling the CellFormatting
event but you are iterating every row to set the backcolor. That event is meant for you to do something to a single, specific cell, the one in question is indicated in the event args: e.RowIndex
and e.ColumnIndex
. Using a loop, you are acting on many more rows than needed and doing so over and over.
Second, VB has data types. Int32
is one type, String
is another, and Object
is yet another. You need to convert one type to the other type before you compare. LaptopGrid.Rows(r).Cells(c).Value
returns Object
(since a cell can literally hold anything), so to compare to 1
you need to convert it to integer.
Finally, you may not want the CellFormatting
event for this. If the cell in question is not on screen, the event wont fire (perhaps the user resized the columns). RowPrePaint
on the other hand will fire when the row scrolls into view.
Private Sub dgv1_RowPrePaint(sender As Object,
e As DataGridViewRowPrePaintEventArgs) Handles dgv1.RowPrePaint
' dont do the NewRow
If e.RowIndex < 0 OrElse dgv1.Rows(e.RowIndex).IsNewRow Then Return
' convert to int32, then compare
' act on just this row - e.RowIndex
If Convert.ToInt32(dgv1.Rows(e.RowIndex).Cells(3).Value) > 3 Then
dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LemonChiffon
Else
dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.MistyRose
End If
End Sub
If the user can edit that cell value, you will want to update the back color accordingly.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…