我正在使用vb.net并且我的数据已经进入我的DGV并且我有一个标记为已部署的列,如果它是'1',我想在已部署的列RED中包含所有行'1'并且如果它是一个'0',我希望所有的行都是绿色的。这是我的方法,现在列是第10列,但它不喜欢=运算符。即使我在1上使用引号和等于比较运算符的字符串。应该是一个整数,但我正在尝试各种方式,看看为什么它不起作用。
Private Sub LaptopGrid_CellFormatting(ByVal Sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles LaptopGrid.CellFormatting
For i As Integer = 0 To LaptopGrid.Rows.Count - 1
If LaptopGrid.Rows(i).Cells(9).Value = 1 Then
LaptopGrid.RowsDefaultCellStyle.BackColor = Color.Green
End If
Next
End Sub
答案 0 :(得分:4)
您的代码存在一些问题。
首先,您正在处理CellFormatting
事件,但您正在迭代每一行以设置背景颜色。该事件旨在让您对单个特定单元格执行某些操作,相关内容将在事件参数e.RowIndex
和e.ColumnIndex
中指明。使用循环,您需要处理的行数多于需要的行数,并且反复这样做。
其次,VB有数据类型。 Int32
是一种类型,String
是另一种类型,Object
是另一种类型。在比较之前,您需要将一种类型转换为另一种类型。 LaptopGrid.Rows(r).Cells(c).Value
返回Object
(因为一个单元格可以保留任何内容),因此要与1
进行比较,您需要将其转换为整数。
最后,您可能不希望发生CellFormatting
事件。如果有问题的单元格不在屏幕上,则事件不会触发(可能是用户调整了列的大小)。另一方面,RowPrePaint
会在行滚动到视图时触发。
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
如果用户可以编辑该单元格值,则需要相应地更新背景颜色。