none
Cambio de color renglón DataGridView. ( Visual Basic Community 2015 ) RRS feed

  • Pregunta

  • Buenas tardes colegas:

    Estoy intentando cambiar de color el renglón dependiendo de una condición que ya le establecí, la condición esta bien y corre adecuadamente por que ya debuguie paso a paso, el detalle es que NO me deja los renglones de los colores que le estable, me pone los renglones todos del mismo color de la ultima condición... ya llevo rato buscándole y NO le encuentro, les dejo el código a ver si alguien puede ver el error que yo NO logro ver:       

    Private Sub OTcmb_SelectedIndexChanged(sender As Object, e As EventArgs) Handles OTcmb.SelectedIndexChanged

    Dim dt As New DataTable
            dt = Me.ConSer.Consulta("SELECT * FROM [BD].[dbo].[Tabla] WHERE id = " & Me.id.Text & ";", "Tabla")
            ListaProcesos.DataSource = Nothing
            ListaProcesos.DataSource = dt
            color(ListaProcesos)

    End Sub

    Public Function color(ByVal dgv As DataGridView) 

            For i As Integer = 0 To dgv.Rows.Count() - 1
                If dgv.Rows(i).Cells(3).Value Is DBNull.Value Then
                    dgv.Rows(i).Cells(3).Value = 0
                End If

                If dgv.Rows(i).Cells(13).Value Is DBNull.Value Then
                    dgv.Rows(i).Cells(13).Value = 0
                End If

                If (Val(dgv.Rows(i).Cells(3).Value) < Convert.ToDouble(dgv.Rows(i).Cells(13).Value)) Then
                    dgv.RowsDefaultCellStyle.BackColor = Drawing.Color.LightCoral   ' Coral
                Else
                    dgv.RowsDefaultCellStyle.BackColor = Drawing.Color.LightGreen
                End If
            Next

        End Function

    lunes, 18 de julio de 2016 18:39

Respuestas

  • ... disculpen las molestias, acabo de ver mi error, dejo la solución por si a alguien le sirve el código ya funcionando en alguno de sus proyectos, solo entrar al IF donde se comparan las 2 celdas NO establecía el indice del reglón; así quedaría el IF lo de mas queda igual.

    If (Val(dgv.Rows(i).Cells(3).Value) < Convert.ToDouble(dgv.Rows(i).Cells(13).Value)) Then
                    dgv.Rows(i).DefaultCellStyle.BackColor = Drawing.Color.LightCoral
                Else
                    dgv.Rows(i).DefaultCellStyle.BackColor = Drawing.Color.LightGreen
    End If

     
    • Propuesto como respuesta RHCRD lunes, 18 de julio de 2016 20:56
    • Marcado como respuesta José De AlvaModerator lunes, 18 de julio de 2016 21:44
    lunes, 18 de julio de 2016 19:00

Todas las respuestas

  • ... disculpen las molestias, acabo de ver mi error, dejo la solución por si a alguien le sirve el código ya funcionando en alguno de sus proyectos, solo entrar al IF donde se comparan las 2 celdas NO establecía el indice del reglón; así quedaría el IF lo de mas queda igual.

    If (Val(dgv.Rows(i).Cells(3).Value) < Convert.ToDouble(dgv.Rows(i).Cells(13).Value)) Then
                    dgv.Rows(i).DefaultCellStyle.BackColor = Drawing.Color.LightCoral
                Else
                    dgv.Rows(i).DefaultCellStyle.BackColor = Drawing.Color.LightGreen
    End If

     
    • Propuesto como respuesta RHCRD lunes, 18 de julio de 2016 20:56
    • Marcado como respuesta José De AlvaModerator lunes, 18 de julio de 2016 21:44
    lunes, 18 de julio de 2016 19:00
  • Hola Roberto C Rodríguez U,

    Puedes usar el CellFormatting para cambiar los valores nulos a 0.

        Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) _
                             Handles DataGridView1.CellFormatting
            'Si es la columna 3 o 13 entra y cambia el valor
            If e.ColumnIndex = 3 Or e.ColumnIndex = 13 Then
                If DataGridView1(e.ColumnIndex, e.RowIndex).Value Is DBNull.Value Then
                    DataGridView1(e.ColumnIndex, e.RowIndex).Value = 0
                End If
            End If
        End Sub

    Así tu DGV ya estará formateada cuando cargue los datos. Y cuando llames al método :

        Public Sub color(ByVal dgv As DataGridView)
    
            dgv.Rows.Cast(Of DataGridViewRow).ToList().
                ForEach(Function(x)
                            If Val(x.Cells(3).Value) < Val(x.Cells(13).Value) Then
                                x.DefaultCellStyle.BackColor = Drawing.Color.LightCoral
                            Else
                                x.DefaultCellStyle.BackColor = Drawing.Color.LightGreen
                            End If
                        End Function)
        End Sub

    Ojo : Es un Sub y no una Function, ya que está última retorna un valor y el SUB no.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI



    lunes, 18 de julio de 2016 19:25
  • Roberto C Rodríguez U,

    Perfecto, va bien que hayas subsanado el error por propia cuenta, pero considera mejorar el código que tienes escrito, te dejo algunas consideraciones:

    Puedes establecer un valor de presentación cuando la celda contenga un valor DBNull o null haciendo uso de la propiedad NullValue

    ListaProcesos.DataSource = dt
    
    ListaProcesos.Columns(3).DefaultCellStyle.NullValue = "0"
    ListaProcesos.Columns(13).DefaultCellStyle.NullValue = "0"

    Por otro lado, la acción de pintar filas frente al cumplimiento de una condición puedes realizarlo en el evento DataBindingComplete que se produce tras finalizar una operación de enlace a un origen de datos.

    Private Sub ListaProcesos_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs)
    	For Each row As DataGridViewRow In ListaProcesos.Rows
    		Dim defaultValue1 As Decimal = 0
    		Dim defaultValue2 As Decimal = 0
    
    		Decimal.TryParse(Convert.ToString(row.Cells(3).Value), defaultValue1)
                    Decimal.TryParse(Convert.ToString(row.Cells(13).Value), defaultValue2)
    
    		row.DefaultCellStyle.BackColor = If(defaultValue1 < defaultValue2, Color.LightCoral, Color.LightGreen)
    	Next
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 18 de julio de 2016 20:55
  • Gracias por el consejo, en una oportunidad lo checo. SALUDOS!!!
    jueves, 28 de julio de 2016 19:01
  • Gracias por el consejo, en una oportunidad lo checo. SALUDOS!!!
    jueves, 28 de julio de 2016 19:02