none
Colorear fila segun estado en datagridview RRS feed

  • Pregunta

  • Buenos Dias, El estado depende de las fechas y los dias limite.

    Cada empresa maneja unos dias de limite para presentar, entonces si se iniciaron hacer unos analisis se toma la fecha actual del sistema, bueno en excel se maneja al estado mediante formula

    =+SI(AN146="Enviado","Emitido a cliente",SI(AN146>0,"Estas a tiempo",SI(AN146<0,"Informe retrasado","En fecha limite")))
    =SI($K152="C",SI(AF152="",$AI152-HOY()-2,"Enviado"),$K152)

    La tabla segun dias por laboratorio se maneja de esta forma:

    Entonces quiero registrar eso y ver mi estado esto va asi:

    Ingreso que laboratorio tomara las muestras cuando es la fecha de analisis, cuando me lo devuelven cuando lo entrego a otro encargado y luego esta muestra cuando la envio a la gerencia para finalmente recien enviarlo al cliente; como podria hacer eso?


    lunes, 12 de marzo de 2018 16:11

Respuestas

  • Solucionado:

    Private Sub dgvIEnsayo_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles dgvIEnsayo.CellFormatting
            For Each row As DataGridViewRow In dgvIEnsayo.Rows
                If row.Cells("EstadoFinal").Value.ToString() = "Emitido a Cliente" Then
                    row.DefaultCellStyle.BackColor = Color.White
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Informe Retrasado" Then
                    row.DefaultCellStyle.BackColor = Color.Red
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Fecha a Límite" Then
                    row.DefaultCellStyle.BackColor = Color.Orange
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Estas a Tiempo" Then
                    row.DefaultCellStyle.BackColor = Color.LightGreen
                Else
                    row.DefaultCellStyle.BackColor = Color.Gainsboro
                End If
    
            Next
        End Sub

    • Marcado como respuesta Javier Roque sábado, 24 de marzo de 2018 17:10
    sábado, 24 de marzo de 2018 17:10

Todas las respuestas

  • Estoy tratando de obtener  una fecha si yo ingreso la fechaIngreso y segun la empresa ese laboratorio dura 3 dias en que lo tenga el cliente entonces, se toma la fecha actual y como ese laboratorio es x 3 dias si hoy lo aplico 12/03/2018 que me calcule el dia de entrega al cliente deberia ser 15/03/2018 y como esta diga A tiempo algo asi o "Ingresado" entonces la fila es color blanco pero si ya han pasado del 15/03/2018 entonces se pinta amarillo y el estado seria "Restrasado" es un tema algo confuso. Si ya se paso y estamos fecha 16/03/2018 entonces la fila estaria roja el estado diria "vencido" 

    estado haciendo algo pero tengo error:

    Private Sub cboDias_TextChanged(sender As Object, e As EventArgs) Handles cboDias.TextChanged
            Dim fechaingreso As DateTime = DateTime.Parse(txtFechaIngresoLab.Text)
            Dim numdias As Integer = Integer.Parse(cboDias.Text)
            txtFechaCliente.Text = fechaingreso.AddDays(numdias).ToString("dd/mm/yyyy")
        End Sub

    con respecto a calcular la fecha cliente segun la fecha de ingreso y los dias que asigne el lab es un combo ya que esta vinculado a la tabla laboratorios escojo el nombre de lab y  en otro combo salen sus dias en base a eso estoy tomando haber si me sale. algo pero tengo error:

    No se puede reconocer la cadena como valor DateTime válido.
    Dim fechaingreso As DateTime = DateTime.Parse(txtFechaIngresoLab.Text)
    en esa linea. Espero me puedan ayudar y luego poder ver ese tema de los estados entre la fecha de ingreso y fecha de cliente existen otras fechas mas. Fechadevolucion, fechaAnalisis,FEchaEntrega al tecnico y fecha de entrega al gerente. Pero pienso que el calculo mas depende de eso pero tambien depende de la conformidad, si el resto de la fila es conforme es C, y se aplica todo eso si no es conforme supongo no prosigue o si es D devuelto y R retirado

    lunes, 12 de marzo de 2018 19:48
  • hola javier tambien puedes usar la

    consulta en un stored procedure

    select *,
    case  
    when dias > 0 
     then dias - (DAY(getdate())-2)
     else 99 
     END as DiasLaboratorio
    from 
    DiasLab

    si usas sql 2012 puedes hacer un iif

    select *, IIF(dias > 0, dias - (DAY(getdate())-2), 99) as DiasLaboratorio from DiasLab

    respecto a tu ultima pregunta cambia dateTime.Parse por Convert.DateTime(txtFechaIngresoLab.Text)

    pero tienes que tener en cuenta el formato de la fecha si es dd/mm/yyyy o MMddYYYY y hay otros factores como el cultureinfo si se toma del sistema.

    el Ejemplo aca --> Ejemplo SQL


    • Editado greg_dorian miércoles, 14 de marzo de 2018 15:42
    lunes, 12 de marzo de 2018 21:29
  • Yo tomo el valor de ese text asi:

    txtFechaIngresoLab.Text = Date.Today.ToString("d")
    y si cambio lo que mencionas simplemente sale error porque convert. no tiene esos valores datetime

    Esta correcto o esta mal?


    lunes, 12 de marzo de 2018 22:32
  • ESto es unas muestras que se van analizar en un laboratorio entonces el laboratorio iqs da plazo masximo de 3 dias que entrega al cliente entonces, se registra la fecha luego si segun iqs es 3 dias entonces se puede calcular cuanto es para entrega al cliente 12/03/2018 + 3 dias seria 15/03/2018 eso se registra en base a eso entonces se puede ver que estoy entre los dias normales con el sistema si estoy cerca del dia o ya estoy en el dia 15/02 pero aun no he tenido resultados entonces la fila pasa a amarillo y el estado cambia si llegue a fecha 16/03/2018 y aun no he enviado nada al cliente entonces la fila se colorea en rojo. eso intento hacer.
    lunes, 12 de marzo de 2018 22:38
  • Yo tomo el valor de ese text asi:

    txtFechaIngresoLab.Text = Date.Today.ToString("d")
    y si cambio lo que mencionas simplemente sale error porque convert. no tiene esos valores datetime

    Esta correcto o esta mal?


    hmm si vas a tomar el día de hoy seria

    txtFechaIngresoLab.Text = DateTime.Today.ToString("dd");

    me imagino que este lo llevas a una base de datos, cuando hayan transcurrido los días o la fecha que necesitas le agregas el entero y comparas con un if si han transcurrido los 3 dias que dices,  lo conviertes a fecha (si lo necesitas en fecha) y muestras el color que necesitas

    miércoles, 14 de marzo de 2018 15:37
  • OK ya estoy trabajando en ello entonces deboponer todo el datetime porque la hora no quiero por eso puse date pero si el formato es asi ok. asi lo hare; aunque probando eso solo me da el dia yo quiero muestre toda dd/mm/yyyy
    • Editado Javier Roque miércoles, 14 de marzo de 2018 20:13
    miércoles, 14 de marzo de 2018 20:11
  • OK ya estoy trabajando en ello entonces deboponer todo el datetime porque la hora no quiero por eso puse date pero si el formato es asi ok. asi lo hare; aunque probando eso solo me da el dia yo quiero muestre toda dd/mm/yyyy
    DateTime.Today.ToString("dd/MM/yyyy");
    miércoles, 14 de marzo de 2018 21:51
  • Por el momento solo pinto celda.

    Private Sub dgvIEnsayo_RowPrePaint(sender As Object, e As DataGridViewRowPrePaintEventArgs) Handles dgvIEnsayo.RowPrePaint
            Try
               
                Select Case dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Value
    
                    Case "Emitido a Cliente"
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.BackColor = Color.Gainsboro
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.ForeColor = Color.Black
    
                       
                    Case "Informe Retrasado"
                       
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.BackColor = Color.Red
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.ForeColor = Color.White
                    Case "Fecha a Límite"
                        
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.BackColor = Color.Orange
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.ForeColor = Color.Black
                   
                    Case "A Tiempo"
                       
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.BackColor = Color.Yellow
                        dgvIEnsayo.Rows(e.RowIndex).Cells("EstadoFinal").Style.ForeColor = Color.Black
                End Select
    
              
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            
        End Sub

    martes, 20 de marzo de 2018 4:49
  • cuando coloreo la fila la grilla se queda parpadeando. Por eso de momento he dejado coloree la celda de la columna q corresponde
    jueves, 22 de marzo de 2018 5:33
  • Mira a ver si esto te puede servir:

       Private Sub dgv_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
          Try
             Select Case dgv.Columns(e.ColumnIndex).Name
                Case "Dias"
                   Dim ValorDias as integer = 0
                   If (dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) IsNot DBNull.Value Then
                      ValorDias = Cint(dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
                   End if
                   With dgv
                      Try
                         If ValorDias > 0 and ValorDias <= 7 Then
                            .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.LightBlue
                         ElseIf ValorDias > 7 and ValorDias <= 10 Then
                            .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.Yellow
                         ElseIfValorDias > 10 and ValorDias <= 20 Then
                            .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.Red
                         Else
                            .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
                         End If
    
                      Catch ex As System.Exception
                         .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
                      End Try
                   End With
             End Select
          Catch ex As System.Exception
             Exit Sub
          End Try
       End Sub
    lo he aplicado a la columna de "Dias", pero, lo  puedes ajustar a cualquier columna



    • Editado rbs61 jueves, 22 de marzo de 2018 11:57
    jueves, 22 de marzo de 2018 11:53
  • Private Sub dgvIEnsayo_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvIEnsayo.CellFormatting
            Dim value As String = TryCast(e.Value, String)
    
            Try
                Select Case dgvIEnsayo.Columns(e.ColumnIndex).Name
                    Case "Estado"
                        Dim Estado As String
                        If (dgvIEnsayo.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) IsNot DBNull.Value Then
                            Estado = CStr(dgvIEnsayo.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
                        End If
                        With dgvIEnsayo
                            Try
                                If Estado = "Emitido a Cliente" Then
                                    .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
                                ElseIf Estado = "Informe Retrasado" Then
                                    .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.Red
                                ElseIf Estado = "Fecha a Límite" Then
                                    .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.Orange
                                ElseIf Estado = "A Tiempo" Then
                                    .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.LightGreen
                                Else
                                    .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
                                End If
    
                            Catch ex As System.Exception
                                .Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
                            End Try
                        End With
                End Select
            Catch ex As System.Exception
                Exit Sub
            End Try
        End Sub

    Estoy bien? porque no pinta

    jueves, 22 de marzo de 2018 15:04
  • Comprueba que la propiedad "Name" de la columna corresponda con el String que tiene el "case", porque me da la impresión que corresponde a la propiedad "Text" (titulo de la columna). Y si no, pon un punto de interrupción en la función y siguelo paso a paso a ver el motivo por el que no te cambia los colores.

    un saludo.


    • Editado rbs61 viernes, 23 de marzo de 2018 7:35
    viernes, 23 de marzo de 2018 7:35
  • Bueno el datagridview es cargado no es echo con columnas en modo diseño tal cual dice la tabla aparece en el dgv; ahora si coloque mal el nombre de la columna pero aun asi no pinta Ahora vere eso del punto
    viernes, 23 de marzo de 2018 20:46
  • Encontre algo pero es muy raro  porque esa columna locacion no tengo tengo localizacion, en fin no esta tomando a la columna EstadoFinal y de esa parte no pasa se va al catch ex y regresa y no pasa de eso

    viernes, 23 de marzo de 2018 20:53
  • Si sabes en que posición esta la columna, podrías utilizar su posición para el Select Case

    por ejemplo si la columna esta en la posición 3 (siempre contando con base 0).

    Select Case dgvIEnsayo.Columns(e.columnIndex)

        Case 3 

           ......

     
    sábado, 24 de marzo de 2018 12:44
  • sábado, 24 de marzo de 2018 15:45
  • Solucionado:

    Private Sub dgvIEnsayo_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles dgvIEnsayo.CellFormatting
            For Each row As DataGridViewRow In dgvIEnsayo.Rows
                If row.Cells("EstadoFinal").Value.ToString() = "Emitido a Cliente" Then
                    row.DefaultCellStyle.BackColor = Color.White
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Informe Retrasado" Then
                    row.DefaultCellStyle.BackColor = Color.Red
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Fecha a Límite" Then
                    row.DefaultCellStyle.BackColor = Color.Orange
    
                ElseIf row.Cells("EstadoFinal").Value.ToString() = "Estas a Tiempo" Then
                    row.DefaultCellStyle.BackColor = Color.LightGreen
                Else
                    row.DefaultCellStyle.BackColor = Color.Gainsboro
                End If
    
            Next
        End Sub

    • Marcado como respuesta Javier Roque sábado, 24 de marzo de 2018 17:10
    sábado, 24 de marzo de 2018 17:10