2016-09-27 40 views
1

我使用的是vb.net,并且我有数据进入我的DGV,并且我有一个标记为已部署的列,如果它是'1',我希望将所有行部署列RED中的'1',如果它是'0',我希望所有行都是绿色的。这是我的方法,现在列是第10列,但它不喜欢=运算符。即使当我使用等于运算符的字符串1上的引号时。应该是一个整数,但我想尽一切办法,看看为什么它不工作。基于列值使DataGridView行变为特定颜色

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 

回答

4

您的代码有几个问题。

首先,您正在处理CellFormatting事件,但您正在迭代每一行以设置背景颜色。该事件仅供您参考单个特定单元格,所涉及的单元格在事件参数中指示:e.RowIndexe.ColumnIndex。使用一个循环,你需要的行数多于需要的数量,并且一遍又一遍地重复。

二,VB有数据类型。 Int32是一种类型,String是另一种类型,而Object是另一种类型。在比较之前,您需要将一种类型转换为另一种类型。 LaptopGrid.Rows(r).Cells(c).Value返回Object(因为单元格可以保存任何东西),所以要与1进行比较,您需要将其转换为整数。

最后,您可能不希望CellFormatting事件。如果有问题的单元格不在屏幕上,则该事件不会触发(可能是用户调整了列的大小)。另一方面,当行滚动进入视图时,另一方面会触发另一个行。

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

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