繁体   English   中英

根据列值使 DataGridView 行具有某种颜色

[英]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.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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM