[英]Making DataGridView rows a certain color based on a column value
I am using vb.net and I have data coming into my DGV and I have a column labeled deployed if it's a '1', I want to have all the rows with '1' in the deployed column RED and if it's a '0', I want all the rows to be GREEN.我正在使用 vb.net,我有数据进入我的 DGV,如果它是“1”,我有一个标记为已部署的列,我希望在已部署的列 RED 中包含所有带有“1”的行,如果它是“0” ',我希望所有的行都是绿色的。 This is my method I have, right now the column is the 10th column but it doesn't like the = operator.
这是我的方法,现在该列是第 10 列,但它不喜欢 = 运算符。 Even when I use quotes on the 1 with equals compare operator for strings.
即使我在 1 上使用引号与字符串的等于比较运算符。 Should be an integer but I was trying every way I could to see why it's not working.
应该是一个整数,但我正在尽我所能了解它为什么不起作用。
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
There are a couple of issues with your code.您的代码有几个问题。
First, you are handling the CellFormatting
event but you are iterating every row to set the backcolor.首先,您正在处理
CellFormatting
事件,但您正在迭代每一行以设置背景色。 That event is meant for you to do something to a single, specific cell , the one in question is indicated in the event args: e.RowIndex
and e.ColumnIndex
.该事件旨在让您对单个特定单元格执行某些操作,有问题的事件在事件参数中指示:
e.RowIndex
和e.ColumnIndex
。 Using a loop, you are acting on many more rows than needed and doing so over and over.使用循环,您正在处理比需要多得多的行,并且一遍又一遍地这样做。
Second, VB has data types.其次,VB 有数据类型。
Int32
is one type, String
is another, and Object
is yet another. Int32
是一种类型, String
是另一种,而Object
是另一种。 You need to convert one type to the other type before you compare.在比较之前,您需要将一种类型转换为另一种类型。
LaptopGrid.Rows(r).Cells(c).Value
returns Object
(since a cell can literally hold anything), so to compare to 1
you need to convert it to integer. LaptopGrid.Rows(r).Cells(c).Value
返回Object
(因为单元格实际上可以容纳任何东西),因此要与1
进行比较,您需要将其转换为整数。
Finally, you may not want the CellFormatting
event for this.最后,您可能不希望
CellFormatting
事件。 If the cell in question is not on screen, the event wont fire (perhaps the user resized the columns).如果有问题的单元格不在屏幕上,则不会触发该事件(可能是用户调整了列的大小)。
RowPrePaint
on the other hand will fire when the row scrolls into view.另一方面,当行滚动到视图中时,
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
If the user can edit that cell value, you will want to update the back color accordingly.如果用户可以编辑该单元格值,您将需要相应地更新背景颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.