lunes, 20 de junio de 2011

[GridView] Aplicar color en las filas

 

Introducción

Este artículo plantea como aplicar color a las filas del gridview basándose en la definición de cierta regla previamente establecida.

En el ejemplo se tiene una lista de productos, la cual por “error” uno fue duplicado, la idea es poder detectar en que registros del grid se presenta este problema y remarcarlo con un color diferente para un fácil reconocimiento.

Se hará uso de linq trabajando junto a un dataset para poder aplicar la verificación de cada ítem en memoria.

El resultado obtenido será el visualizado en la imagen siguiente:

Determina color GridView

Para aplicar la lógica de colores en cada fila del grid será usado el evento RowDataBound, el mismo se lanza por cada row creada en el grid, es por eso que validando la información de la fila contra el origen de datos será posible determinar si la información esta repetida

 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string desc = e.Row.Cells[0].Text;

        int cant = (from item in ((DataTable)Session["datos"]).AsEnumerable()
                      where item.Field<string>("Descripcion") == desc
                      select item).Count();

        if (cant > 1)
        {
            e.Row.BackColor = Color.LightCoral;
        }
        
    }
}

 

[C#]
[C# SkyDrive]

14 comentarios:

  1. Gracias pos tus Publicacion, son de gran utilidad y se aprende mucho de ellas, gracias por las explicaciones.

    ResponderEliminar
  2. Hola leandro, me darias una manita pasandolo a vb?, lo intente con los website que estan en internet pero con errores y no me ejectua.. gracias

    ResponderEliminar
  3. listo ya lo consegui

    Dim desc As String = e.Row.Cells(0).Text
    Dim cant As Integer = (From item In (CType(Session("datos"), DataTable)).AsEnumerable() Where item.Field(Of String)("Descripcion") = desc Select item).Count()

    If cant > 1 Then
    e.Row.BackColor = Drawing.Color.Aquamarine
    End If



    :)

    ResponderEliminar
  4. Hola Leandro.
    ¿Como puedo colorear solo una celda que cumpla cierta condición? Para las filas uso "e.Row.ForeColor = System.Drawing.Color.Red" en un IF y me va bien, pero ahora solo quiero una celda y no lo consigo con "e.Row.Cells[3].BackColor = System.Drawing.Color.Red"?
    Saludos, Jaume

    ResponderEliminar
  5. Hola Leandro.
    Creo que el problema está en que yo uso VB y esta sentencia es de C#. ¿Tienes idea de como se pone en VB?

    ResponderEliminar
  6. Hola Leandro.
    Ya encontré la solución:
    e.Row.Cells(0).BackColor = Drawing.Color.Red
    Un saludo

    ResponderEliminar
  7. Hola Leandro..
    Gracias por su publicaciones en todas partes me han salvado de muchas...
    Pero una consulta también se puede cambiar el color de la letra de las filas de gridview..
    Probe con lo siguiente pero no me dio resultado
    e.Row.ForeColor = Drawing.Color.FromName("#ffc7ce")

    Saludos
    Katita

    ResponderEliminar
  8. Hola Leandro,
    Ya vi que era la clase por la cual no dejaba que cambiara el color de la letra...
    Igual gracias ;)
    Saludos

    ResponderEliminar
  9. Leandro tengo una duda, este ejemplo lo adapte y funciono muy bien no tuve problema, pero que pasa cuando tengo en el
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" <---------------, mandando llamar los datos de una Stored procedure, y desplegandolos en el grid, manejo asp.net c#.

    Agradeceria mucho tu apoyo

    ResponderEliminar
    Respuestas
    1. hola

      si defines el AutoGenerateColumns = true lo que hara es generar las columnas que muestra el gridview de forma dinamica segun los campos (si es un datatable) o las propiedades (si es una List<> de una clase que defines) automaticamente

      mostrara todos los campos/propiedades y no tendras el control sobre que ocultar
      es mas puedes hacer la prueba define un gridview simple sin columnas y asigna un datasource

      saludos

      Eliminar
  10. Al ponerle color por este evento a las filas. Se borra la configuración de color de fila cuando esta seleccionada y ya no lo resalta. Alguna idea como lograr los dos efectos. Saludos

    ResponderEliminar
    Respuestas
    1. hola
      El evento RowDataBound se ejecuta cuando asignas el DataSource y realizas el Databind() del grid, por lo tanto no hay seleccion en ese momento ya que estas cargando las rows
      La seleccion deberias realizarla por medio de algun link o boton en la rows.
      saludos

      Eliminar