Principales respuestas
Colorear row en GridView basado en fecha

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.
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- Propuesto como respuesta Joyce_ACModerator viernes, 30 de junio de 2017 15:03
- Marcado como respuesta Joyce_ACModerator lunes, 3 de julio de 2017 13:54
-
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
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 resultadoprotected 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
-
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- Propuesto como respuesta Joyce_ACModerator viernes, 30 de junio de 2017 15:03
- Marcado como respuesta Joyce_ACModerator lunes, 3 de julio de 2017 13:54
-
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!!!
-
-
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?.
-
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?
-
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
-
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
-