根据列值使DataGridView行成为某种颜色

时间:2016-09-27 18:39:51

标签: .net vb.net datagridview

我正在使用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

1 个答案:

答案 0 :(得分:4)

您的代码存在一些问题。

首先,您正在处理CellFormatting事件,但您正在迭代每一行以设置背景颜色。该事件旨在让您对单个特定单元格执行某些操作,相关内容将在事件参数e.RowIndexe.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

enter image description here

如果用户可以编辑该单元格值,则需要相应地更新背景颜色。