none
Colorear row en GridView basado en fecha RRS feed

  • Pregunta

  • Buenos días, necesito colorear las filas de mi GridView basado en la relación con la fecha del día.

    Tengo una columna en mi base de datos que se llama Fecha_compromiso. Necesito colorear si esa fecha esta cercana al día de hoy en diferentes colores. Básicamente, si esa fecha es mayor a 10 días de color verde. Si está entre 4 y 9 días de color amarillo y si es menor a 3 días de color rojo.

    Lo que tengo hoy es lo siguiente:

    protected void gvvencimientos_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    DateTime fecha = Convert.ToDateTime(e.Row.FindControl("Fecha_compromiso"));
                    TimeSpan dif = DateTime.Now.Subtract(fecha);
    
                    int dias = dif.Days;
    
                    if (dias > 10)
                    {
                        e.Row.BackColor = Color.LightGreen;
                    }
                    else if (dias > 4)
                    {
                        e.Row.BackColor = Color.LightYellow;
                    }
                    else
                    {
                        e.Row.BackColor = Color.Red;
                    }
    
                }
    
            }

    Evidentemente algo estoy haciendo mal porque me pinta todo de verde, por mas que la fecha de compromiso sea mañana. Me podrían ayudar y guiarme?

    Muchas gracias

    Germán.

    lunes, 15 de mayo de 2017 21:08

Respuestas

  • hola

    >>Evidentemente algo estoy haciendo mal porque me pinta todo de verde, por mas que la fecha de compromiso sea mañana

    si pones un breakpoint en el codigo y ejecutas paso a paso podrias pasar el mouse por las variables y ver que valor estan tomando

    quizas piensas que defines una fecha pero esta tomando otra por eso el calculo no es el que esperas, puede ser un tema de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 29 de junio de 2017 13:51
  • Cambie completamente el gridview. Antes lo tenía con templatefield ahora lo puse así

    <Columns>
                   <asp:BoundField HeaderText="DNI" DataField="DNI" />
                   <asp:BoundField HeaderText="Apellido" DataField="Apellido" />
                   <asp:BoundField HeaderText="Nombre" DataField="Nombre" />
                   <asp:BoundField HeaderText="Fecha Compromiso" DataField="Fecha_compromiso" DataFormatString="{0:d}" />                                      
                        <asp:TemplateField HeaderText="Detalle">
                            <ItemTemplate>
                                <a href="#" id="link" onclick='openWindow("<%# Eval("DNI") %>");'>Detalle</a>
                            </ItemTemplate>
                        </asp:TemplateField>
               </Columns>

    Use nuevamente tu sugerencia con este gridview y funciono a la perfección. Desde ya muy agradecido por tu tiempo!.

    Saludos!

    • Marcado como respuesta gw_lapida jueves, 13 de julio de 2017 20:55
    jueves, 13 de julio de 2017 20:54

Todas las respuestas

  • Modifique un poco tu codigo para realizar pruebas espero te sirva, lamentablemente no puedo subir imagen del resultado

    busco por el indice en el cual se encuentran los datos de la columna que contiene la fecha

    este seria el resultado 

    protected void Page_Load(object sender, EventArgs e)
            { 
    
              DataTable tabla = new DataTable();
    
              tabla.Columns.Add("Datos1", typeof(int));
    
              tabla.Columns.Add("Datos2", typeof(string));
    
              tabla.Columns.Add("Fecha", typeof(DateTime));
    
              tabla.Rows.Add(new object[]{1,"Prueba 1 ","28/08/2017"});
              tabla.Rows.Add(new object[] { 2, "Prueba 2 ", "06/07/2017" });
              tabla.Rows.Add(new object[] { 3, "Prueba 3 ", "20/06/2017" });
    
                GridView1.DataSource = tabla;
                GridView1.DataBind();
    
    }
    
    protected void gvvencimientos_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    DateTime fecha = Convert.ToDateTime(e.Row.Cells[2].Text);
                     // TimeSpan a = (fecha - DateTime.Now); 
    
                     TimeSpan dif = fehca.Subtract(DateTime.Now);
    
    
                    int dias = dif.Days;
    
                    if (dias > 10)
                    {
                        e.Row.BackColor = Color.LightGreen;
    
                        e.Row.ToolTip = "Mensaje 1";
                    }
                    else if (dias > 4)
                    {
    
                        e.Row.BackColor = Color.LightYellow;
    
                        e.Row.ToolTip = "Mensaje 2";                }
                    else
                    {
                        e.Row.BackColor = Color.Red;
    
                        e.Row.ToolTip = "Mensaje3";
                    }
    
                }
    
            }




    • Editado osrol sábado, 3 de noviembre de 2018 13:09 quitar link de imagen
    miércoles, 28 de junio de 2017 19:22
  • hola

    >>Evidentemente algo estoy haciendo mal porque me pinta todo de verde, por mas que la fecha de compromiso sea mañana

    si pones un breakpoint en el codigo y ejecutas paso a paso podrias pasar el mouse por las variables y ver que valor estan tomando

    quizas piensas que defines una fecha pero esta tomando otra por eso el calculo no es el que esperas, puede ser un tema de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 29 de junio de 2017 13:51
  • Gracias por responder! y perdón por mi atraso en contestar. Probé tu sugerencia, pero sigue el mismo "error", se pintan todos de un mismo color. Intentaré otras cosas, pero hoy lo deje directamente sin colorear.

    Estoy pensando que capaz el find control no esta bien aplicado para "encontrar" el valor de la fecha de compromiso. Seguiré intentando.

    Desde ya muchas gracias!!!

    jueves, 13 de julio de 2017 15:15
  • Intentaste con el ejemplo que te deje?

    este es el resultado que yo obtengo 

    Saludos.



    • Editado osrol sábado, 3 de noviembre de 2018 13:10 cambiar link de imagen
    jueves, 13 de julio de 2017 15:30
  • Hola, si intente con lo que me sugeriste, pero no logré separar los colores.

    Aprovecho y te hago una consulta. El tipo de datos en SQL para el campo fecha_compromiso es SMALLDATETIME. En el gridview al campo fecha_compromiso lo puse para que me muestre con el formato (dd/mm/yyyy). Según tu punto de vista, ¿crees que por ahí estará el problema?.

    jueves, 13 de julio de 2017 19:55
  • Hice como me dijo Leandro arriba, de usar un "breakpoint" (es la primera vez que uso, dime si lo estoy usando mal) te mando la captura de la pantalla.

    Ahí puse el punto de interrución. Ahora te mando lo que me captura la variable "fecha"

    si esta bien colocado el punto, me toma un valor nulo. Tu que opinas que puede estar pasando?

    jueves, 13 de julio de 2017 20:05
  • Pasa lo siguiente el FindControl no encuentra la celda entonces te asigna la fecha por defecto si no sabes en que indice se encuentra crea el siguiente metodo que te paso

      int ObtenerIndicePorNombre(GridViewRow row, string columnName)
            {
                int Index = 0;
                foreach (DataControlFieldCell cell in row.Cells)
                {
                    if (cell.ContainingField is BoundField)
                        if (((BoundField)cell.ContainingField).DataField.Equals(columnName))
                            break;
                   Index++; // suma 1 mas hasta que encuentre la columna correcta
                }
                return columnIndex;
            }

    y tu codigo debe quedar algo asi

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
            {

    if (e.Row.RowType == DataControlRowType.DataRow) { int index = ObtenerIndicePorNombre(e.Row, "Fecha_compromiso");// debe ser el mismo nombre de la columna DateTime fecha = Convert.ToDateTime(e.Row.Cells[index].Text);//obtiene el dato segun el indice TimeSpan dif = DateTime.Now.Subtract(fecha); int dias = dif.Days; if (dias > 10) { e.Row.BackColor = Color.LightGreen; } else if (dias > 4) { e.Row.BackColor = Color.LightYellow; } else { e.Row.BackColor = Color.Red; } } }

    Prueba y comentas los resultados.

    Saludos



    • Editado osrol jueves, 13 de julio de 2017 20:52
    jueves, 13 de julio de 2017 20:48
  • Cambie completamente el gridview. Antes lo tenía con templatefield ahora lo puse así

    <Columns>
                   <asp:BoundField HeaderText="DNI" DataField="DNI" />
                   <asp:BoundField HeaderText="Apellido" DataField="Apellido" />
                   <asp:BoundField HeaderText="Nombre" DataField="Nombre" />
                   <asp:BoundField HeaderText="Fecha Compromiso" DataField="Fecha_compromiso" DataFormatString="{0:d}" />                                      
                        <asp:TemplateField HeaderText="Detalle">
                            <ItemTemplate>
                                <a href="#" id="link" onclick='openWindow("<%# Eval("DNI") %>");'>Detalle</a>
                            </ItemTemplate>
                        </asp:TemplateField>
               </Columns>

    Use nuevamente tu sugerencia con este gridview y funciono a la perfección. Desde ya muy agradecido por tu tiempo!.

    Saludos!

    • Marcado como respuesta gw_lapida jueves, 13 de julio de 2017 20:55
    jueves, 13 de julio de 2017 20:54
  • Me alegra haberte podido ayudar.

    Saludos.

    jueves, 13 de julio de 2017 21:09