Hacer que DataGridView filas un determinado color en función de un valor de columna

Estoy usando vb.net y tengo datos entrando en mi DGV y tengo una columna etiquetada desplegada si es un ‘1’, quiero tener todas las filas con ‘1’ en la columna desplegada ROJA y si es un ‘0 ‘, Quiero que todas las filas sean VERDES. Este es mi método, ahora mismo la columna es la décima columna pero no le gusta el operador =. Incluso cuando uso comillas en el operador 1 con igual comparación para cadenas. Debería ser un número entero, pero estaba intentando de todas las formas posibles para ver por qué no está funcionando.

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 

Hay un par de problemas con su código.

En primer lugar, está manejando el evento CellFormatting pero está iterando cada fila para establecer el color de fondo. Ese evento está destinado a que usted haga algo en una celda única y específica , el que está en cuestión se indica en los e.RowIndex del evento: e.RowIndex y e.ColumnIndex . Usando un bucle, estás actuando en muchas más filas de las necesarias y repitiéndolo una y otra vez.

En segundo lugar, VB tiene tipos de datos. Int32 es un tipo, String es otro y Object es otro más. Necesita convertir un tipo al otro tipo antes de comparar. LaptopGrid.Rows(r).Cells(c).Value devuelve Object (ya que una celda puede contener literalmente cualquier cosa), por lo que para compararla con 1 , necesita convertirla a entero.

Finalmente, es posible que no desee el evento CellFormatting para esto. Si la celda en cuestión no está en la pantalla, el evento no se disparará (tal vez el usuario cambie el tamaño de las columnas). RowPrePaint por otro lado se activará cuando la fila se desplace a la vista.

 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

Si el usuario puede editar ese valor de celda, querrá actualizar el color de fondo en consecuencia.