![](/img/trans.png)
[英]DataGridView change row header color based on value in a column foreach row
[英]Making DataGridView rows a certain color based on a column value
我正在使用 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
您的代码有几个问题。
首先,您正在处理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
如果用户可以编辑该单元格值,您将需要相应地更新背景颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.