El GridView y sus eventos: El RowDataBound

En este post, vamos a ver el evento (seguramente el más usado), el RowDataBound. Vamos a ver cuando se ejecuta, cual es su finalidad y lo que nos aporta.

El GridView es un control que nos proporciona ASP.NET cuya funcionalidad es “trabajar” con información tabular. Seguramente es uno de los controles más usados y a lo lardo de las distintas versiones de Visual Estudio, ha cambiado el nombre, pero siempre se ha mantenido. Este control, es muy pesado y consume gran cantidad de memoria pero aporta mucha funcionalidad que muchas veces no llegamos a aprovechar porque generalmente lo usamos para mostrar información (entendamos que hablo de aplicaciones Web).

Este post forma parte de una serie de post llamada El GridView y sus Eventos. Los post que forman esta serie y que si has llegado aquí te pueden interesar son:

El evento RowDataBound

El evento RowDataBound, se levanta cada vez que un DataItem es bindado. Es decir, cada vez que se vaya a enlazar información de nuestra fuente de datos a una fila del GridView este evento salta.

Este evento es tremendamente útil cuando sea necesario modificar la información que le vamos a mostrar al usuario.

Imaginar que queremos formatear una fecha, o sustituir por imágenes (ok, ko etc.) un campo que nos marque un estado, pues sería por medio de este evento donde lo haríamos.

Una implementación sencilla de este evento, tendría el siguiente aspecto:

protected void GvCountries_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Country country = (Country) e.Row.DataItem;
Literal l = (Literal)e.Row.FindControl("ltrlName");
if (l != null) l.Text = country.Name;
}
}

Como veis, es sencillo, cada vez que salta comprobamos el tipo de row que nos viene y operamos, yo en mi caso unicamente le asigno un valor a un literal.

Para enlazar el evento al control, tenemos que hacerlo de la siguiente forma:

<asp:GridView
ID="gvCountries"
runat="server"
DataKeyNames="CountryCode"
CssClass="cssTableGrid"
AutoGenerateColumns="False"
OnRowDataBound="GvCountries_RowDataBound"></asp:GridView>

Y si tambien quieres hacerlo programáticamente sería asi:

gvCountries.RowDataBound += new GridViewRowEventHandler(gvCountries_RowDataBound);

Esto no tiene más. Facil verdad, pues si, pero a lo largo de estos post, veremos que con un GridView y algunos de sus eventos implementados y ademas un poquito de Ajax vamos a conseguir unos resultados espectaculares que a más de uno le dejaran con la boca abierta (sobre todo por lo usable que va a ser el asunto)

Post relacionados.

Este post forma parte de una serie de post llamada El GridView y sus Eventos. Los post que forman esta serie y que si has llegado aquí te pueden interesar son:

Descargas – Downloads

18 pensamientos en “El GridView y sus eventos: El RowDataBound

  1. El GridView y sus eventos: El evento PageIndexChanging « a deshoras

  2. Ordenando un GridView mediante el evento Sorting (El GridView y sus eventos: El evento Sorting) « a deshoras

      • Tengo un Gridview con un buttonfield del tipo image, en el grid tengo un estado, dependiendo de este estado se tiene que habilitar o deshabilitar este buttonfield, pregunta como puedo lograr esto? estoy trabajando con VS 2010 en asp.net con vb. gracias de antemano.

      • Hola Juan Carlos.

        Entiendo que no puedes buscarlo debido a que este control no tiene ID y utilizas un CommandName ¿Es así?

        Bien si este es el caso, lo que te recomiendo es que modifiques el ButtonField por un TemplateField con un botón. Sería algo asi:

        <asp:templatefield headertext="Cancel">
         <itemtemplate>
         <asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" /">
         </itemtemplate">
         </asp:templatefield">

        De esta forma podrías buscarlo en el RowDataBound con un código similar a este:

        Button b = (Button)e.Row.FindControl("Btn");

        Y posteriormente deshabilitarlo. Si no puedes modificarlo, podrías acceder a el con un código de este tipo:

        Button btn = (Button)e.Row.Cell[n];

        Sustituyendo el por el indice de la celda donde se encuentre.

        Todo esto te lo digo de memoria, por lo tanto estos códigos pueden no ser muy exactos.

        Espero que esto te ayude.

        Un saludo y gracias por comentar en este blog.

  3. Hola buena tarde, trabajo con un GridView ( VS 2010 en asp.net con vb.)que se alimenta de una base de datos SQL Server, entre las columnas, tengo una que almacena correos, le agregue un boton (enviar) que se convirtio ya en TemplateField para poder darle atributos como click, etc, lo que busco con este boton es que al momento de dar click sobre el mande un correo con cualquier información tomando los el correo del GridView, la verdad no se si este evento me pueda ayudar o si tengas alguna idea de lo que busco realizar, de antemano mil gracias.

    • Hola socra.

      Trata de realizar el binding del evento click en cada RowDataBound. Sería algo así:

      Button b = (Button)e.Row.FindControl("Btn");
      b.onclik += Button_Click;

      La firma del evento sería algo asi:

      void Button_Click(object sender, EventArgs e) { }

      Y en Button_Click realizas el envío del correo. Trata de suscribir el valor de email en la propiedad DataKeys del GridView de manera que cuando se ejecute el Button_Click, a través del sender, puedas acceder a esa información.

      Todo esto te lo digo de memoria así que es posible que exista algún error.

      Espero que sea de ayuda.

  4. Excelente post amigo, hacen falta mas blogs así, que te expliquen la programación en lenguaje entendible y no muy técnico como los de microsoft, sigue adelante, gracias.

  5. Hola Cesar, Tengo una pregunta,Tengo un control GridView el cual me controla la manera de seleccionar un detalle producto, el detalle tiene las siguientes columnas con sus respectivos itemtemplates:

    Referencia(it:dropdownlist),talla(it:dropdownlist),color(it:dropdownlist),cantidad(it:textbox).

    el problema radica en que cuando selecciono una referencia, el dropdownlist de la columna talla y color deben de cargar con los datos correspondientes de la referencia seleccionada.
    Que evento se dispara al realizar la seleccion del item en el dropdownlist de referencia para poder generar el codigo que me cargue los otros dos dropdownlist de las columnas talla y color?

    Espero me puedan colaborar y resolver mi duda. Mil gracias.

    • Hola Daniel. Te lo digo de memoria. El evento que saltara será el onchange.

      Tienes que suscribirte a él en el itemDataBound

      Gracias por tu comentario

  6. Gracias por el aporte amigo, ya lo de la asignacion al literal lo tengo, pero ahora necesito el caso contrario, si quiero modificar el valor que tiene el gridview es decir, el gridview muestra el valor will y quiero modificarlo por will@gmail.com, concatenando el dominio y asignandoselo al gridview. quedo atento a su colaboracion muchas gracias.

  7. Hola colega! como puedo hacer para obtener el valor de cierta columna cuando el evento se esta ejecutando?… por ejemplo saber el valor de la columna 2?….

Deja un comentario