Visual Basic.NET - Colorear filas de un Datagridview

 
Vista:
Imágen de perfil de Matt
Val: 180
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Matt (75 intervenciones) el 28/08/2020 07:40:50
Hola Foro!

Amigos, estoy tratando de colorear las filas de un DataGridView deacuerdo a su contenido, la siguiente imagen muestra una lista de tickets con sus respectivas fechas y hora en que se generaron, cada ticket posee diferente numero de filas, lo que yo quiero es colorear el BackColor de todas las filas del ticket 1 de color (Naranja), las del ticket 2 de color (Verde) y así repetir con cada uno de los tickets existentes... (Naranja) - (Verde) - (Naranja) - (Verde) etc...

image20

No se como implementar esta idea en código VB.NET
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de melqui
Val: 643
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por melqui (242 intervenciones) el 28/08/2020 15:47:37
vea en tu evento load coloca un loop o un for
1
2
3
4
5
6
For i As Integer = 0 To datagrid.RowCount - 1
if  datagrid.Rows(i).cells("aqui el nombre de la columna").value = 'aqui tienes que colocar un valor de la columna' then
datagrid.Rows(i).backcolor =color.red
else
datagrid.Rows(i).backcolor =color.yellow
  Next

lo ideal seria que creas una coluna par que diferencies las lineas que quieres colocar colores. ejemplo

CODIGO|NOMBRE|HORA|CATEGORIA


en la columna categoria puedes colocar apenas numeros 1, 2 3

asi cuando pasas el loop queda mas o menos asi

1
2
3
4
5
6
7
8
9
For i As Integer = 0 To datagrid.RowCount - 1
if  datagrid.Rows(i).cells("CATEGORIA").value = 1 then
datagrid.Rows(i).backcolor =color.red
elseif datagrid.Rows(i).cells("CATEGORIA").value = 2 then
datagrid.Rows(i).backcolor =color.yellow
 
elseif datagrid.Rows(i).cells("CATEGORIA").value = 3 then
datagrid.Rows(i).backcolor =color.black
  Next


simples asi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Matt
Val: 180
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Matt (75 intervenciones) el 28/08/2020 21:24:48
Hola Melqui!

Gracias por responder...
Mira estoy trabajando en un DataGridview que ya esta populado, ya no puedo agregar mas columnas, solo quiero loopear el Datagridview e identificar cuales fila tienen la misma fecha y hora para pintarles el BackColor, luego seguir con el loop y pintar el siguiente grupo de items, de diferente color. No quiero manejar mas de 2 colores, pero si que se vayan intercalando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de melqui
Val: 643
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por melqui (242 intervenciones) el 28/08/2020 21:37:29
use el ejemplo
independiente si vas usar 1 o mas grupos.
ahora como no la veo en tu fuente que hace la funcion para distinguir, vas a necesita run poco de imaginacion ya que no quieres usar mas columnas, mas creo que tendrias que usar un metodo de tiempo
ejemplo
1
2
3
4
se  0:00 a 1:00 entonces
color 1
sino
color 2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Matt
Val: 180
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Matt (75 intervenciones) el 29/08/2020 01:05:37
OK muchas gracias por tu respuesta.

Creo que no me he dado a entender bien.

Solo necesito pintar todas las filas de mi DGV que tengan la misma fecha usando solo 2 colores como se muestra a continuación...

DGV

Y esta es la tabla real de mi base de datos:

Tabla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Phil Rob (1554 intervenciones) el 29/08/2020 10:46:27
Hola,

Cuando veo los mensajes anteriores, me parece difícil de escribir una buena repuesta a tu pregunta.
Quizá el código siguiente podrá te dar buenas ideas ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
' Escribir este codigo en una funcion o en un procedimiento evento
 
        If DataGridView1.Rows.Count < 1 Then Exit Sub ' error si ninguna linea en DGV
 
        ' En esta ejemplo, la columna para colorar es la columna indicia 5 que es llamada DGV_Col_4
        Dim NombreDeLaColumna As String = "DGV_Col_4"
 
        ' Ordenar DGV segun este columna. No es necesario si DGV ya ordenado.
        DataGridView1.Sort(DataGridView1.Columns(NombreDeLaColumna), System.ComponentModel.ListSortDirection.Ascending)
 
        Dim Valor As String = Nothing
        Dim ValorAnterior As String = Nothing
 
        Dim ColorRow1 As Color = Color.Yellow
        Dim ColorRow2 As Color = Color.LightBlue
 
        Dim ColorRow As Color = ColorRow1
 
        For R As Integer = 0 To (DataGridView1.Rows.Count - 2)   ' escribir -1 si no ultima linea vacia en el DataGridView1
            Valor = DataGridView1.Item(NombreDeLaColumna, R).Value
            If ValorAnterior Is Nothing Or Valor <> ValorAnterior Then
                If ColorRow = ColorRow1 Then
                    ColorRow = ColorRow2
                Else
                    ColorRow = ColorRow1
                End If
            End If
            DataGridView1.Rows(R).DefaultCellStyle.BackColor = ColorRow
            ValorAnterior = Valor
        Next

Que tenga un buen día ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Colorear filas de un Datagridview

Publicado por Nacho (56 intervenciones) el 29/08/2020 11:37:43
Viendo los mensajes de este foro yo me pregunto para qué entro.

1 - Matt, deja de preocuparte de si te entiendo o no. Tu preocupación debe ser entenderme tú a mí. Hace 30 años que pasé yo por eso que estás pasando tú ahora. Sé perfectamente en qué consiste y desde entonces estoy viéndolo continuamente.

2 - Da igual si quieres pintar sólo dos filas o todas o si con un color o con 50. El código es igual. La única diferencia es la condición que tengas que poner para determinar si tienes que pintar la celda o no y la que determine el color.

3 - Pintar una ventana en Windows, siempre en el evento paint. No en un evento time, ni en click, ni con un loop, ni leches. Si alguien ha descubierto que para pintar en Windows es mejor usar otra manera que se lo comunique a Microsoft, que seguro que lo publica en la msdn mismamente. Ahí lo leeré yo, como he leído montones de veces que hay que pintar en un evento paint, como he leído millones de cosa más, y entonces empezaré a usar esa otra manera. Mientras tanto, evento paint.

4 - En resumen: evento _CellPainting, que cuando lo requieres, quedará así en el código:

Private Sub dataGridView1_CellPainting(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _

end sub

Cada vez que el Windows tenga que pintar una celda del dataGridView1 llamará a ese evento. Da igual si tienes que pintar una, da igual si tienes que pintar todas, da igual si quieres pintarla de colores o quieres poner un corazoncito. Ese evento lo he usado yo para poner un icono en una celda. Una vez en ese evento, puedes comprobar que valor tiene esa celda. En el ejemplo de la página que te he pasado creo que está bien claro

If (e.Value [lo que sea]) Then [lo que quieras]

O sea, en e, que es un System.Windows.Forms.DataGridViewCellPaintingEventArgs, tienes, entre otras muchas cosas, el valor de la celda que hay que pintar.

Entonces

If (e.Value = [la fecha que sea]) Then [pinta la celda de tal color]
If (e.Value = [la otra fecha que sea]) Then [pinta la celda de tal otro color]

En el ejemplo de la página que te he pasado puedes ver e.Graphics.FillRectangle(backColorBrush, e.CellBounds). Eso pinta la celda del color backColorBrush. A ver si va a ser eso lo que quieres hacer.

Otro campo importante de e es Handled. Como la pintas tú, no tiene que pintarla el Windows y tienes que pasarle al Handled el valor true. Así no la pinta el Windows. Todo eso está en la página que te he pasado de ejemplo. Te la paso otra vez en vb-net que igual así lo ves más claro.

https://docs.microsoft.com/es-es/dotnet/api/system.windows.forms.datagridview.cellpainting?view=netcore-3.1

Ahora intenta entenderme tú a mí, a Microsoft y su msdn, y resolverás el problema.

Luego seguid votando en contra de lo que dice el que sabe un huevo de programación y siete huevos de Windows, que así os irá en este foro. Podéis hacer lo que queráis, que yo no vuelvo a entrar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Phil Rob (1554 intervenciones) el 29/08/2020 17:49:19
Hola Nacho,

No he comprendido la pregunta de Matt o no comprendo tu mensaje, o comprendo nada ....

Comprendo que Matt quiere cambiar el BackColor de líneas de su DatadGrigView. Si es bien como este, pienso que Matt pregunta cual algoritmo para cambiar este BackColor cuando este es el momento.

Comprendo en tu mensaje que dices de programar el algoritmo en el procedimiento evento CellPainting. Entonces, comprendo que Matt debe cambiar el BackColor cuando arriba este evento. Pero creo que este evento arribara cuando el BackColor cambia.

Para mí, tenemos que cambiar el BackColor para obtener el CellPainting y no el contrario.

Por favor, puedes explicar donde es mi error?

Muchas gracias,

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Matt
Val: 180
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Matt (75 intervenciones) el 29/08/2020 17:46:18
Muchas gracias Mr. Phill.

Su código funcionó perfectamente!!!
Solo tengo un pequeño problema, y es que cuando hago click en header del DataGridView1, todas las celdas cambian su BackColor a color blanco.

Click


White

Ya traté de dehabilitar en evento CellContentClick del DataGridView1 con el siguiente código y no funcionó:

1
2
3
4
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        If e.RowIndex < 0 Then
        End If
    End Sub

Tambien intenté deshabilitar la propiedad .SortMode del DataGridView1 con el siguiente código:

1
DataGridView1.Columns(0).SortMode = DataGridViewColumnSortMode.NotSortable

y este me da el siguiente error.
System.ArgumentOutOfRangeException: 'El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.

Lo que quiero es que cuando el usuario haga click en header del DataGridView, no pase nada, ni me cambien el BackColor de todas las celdas del DataGridView1.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Matt
Val: 180
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Matt (75 intervenciones) el 29/08/2020 18:03:55
Una disculpa Mr Phil, estaba tratando de hacer aciones en el DataGridView1 antes de popularlo.
Ahora funciona con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
With DataGridView1
    .Columns("Concepto").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Cantidad").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Importe").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Fecha").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Entradas").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Salidas").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Motivo_de_la_Salida").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Realizado_Por").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Tipo_de_Pago").SortMode = DataGridViewColumnSortMode.NotSortable
    .Columns("Usuario_de_caja").SortMode = DataGridViewColumnSortMode.NotSortable
End With

Muchas gracias por todo Mr. Phill !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Colorear filas de un Datagridview

Publicado por Phil Rob (1554 intervenciones) el 29/08/2020 18:08:37
Hola Matt,

Nos mensajes están enviados casi simultáneamente. Ahora, sé que he comprendido bien tu pregunta.

Si no las rows cambian bien sus BackColor cuando cambia el ordenado de los valores, este es que no has puesto mi código al bon lugar.

Quiza debe lo poner en el evento ColumnHeaderMouseClick :
1
2
3
Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
    ' .....
End Sub

Atencion, en este caso, tienes que borrar la linea DataGridView1.Sort( ....



Todavía enviamos los mensajes simultaneos !!!
Miras que con este código, puedes permitir los HeaderClick, los Rows cambian y los colores están todavía bien.

Dejo mi PC hasta mas tarde ....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar