La mayor parte de los sitios web que se sirven de listados lo hacen utilizando un esquema como el que sigue:
Como vemos, lo normal suele ser utilizar campos enlazados a la consulta (BoundFields), así como campos-plantilla (TemplateFields) con los que se suele interactuar con el listado (ver detalles, edición, etc.).
Si sabemos de antemano qué datos vamos a obtener, es sencillo «maquetar» nuestro GridView de forma sencilla. El problema radica en el momento en el que el número de columnas que nuestro GridView mostrará sea variable. En este caso, el atributo AutoGenerateColumns deberá ser puesto a True, con lo que perderemos el control del orden de los TemplateFields.
Veamos el siguiente caso: queremos un campo plantilla que muestre un LinkButton que nos permita editar el registro, y otro que nos permita visualizar los detalles del mismo. Queremos uno de estos campos en la primera columna (el de edición) y otro en la última (visualización). Si utilizamos TemplateFields con el atributo AutoGenerateColumns=»True», lo que lograremos será que ambos botones se sitúen juntos en las dos primeras columnas de nuestro GridView. ¿Cómo hacer que uno de ellos se coloque al final? Añadiéndolo de forma dinámica.
Para comenzar, añadiremos un GridView con un TemplateField conteniendo un LinkButton, colocando el atributo AutogenerateColumns=»True».
El templatefield contendría un LinkButton:
El resultado sería este:
Seguidamente, acudiremos a nuestro código, listos para editar el evento RowDataBound. En él haremos lo siguiente:
- Declararemos una celda y un LinkButton.
- Daremos formato al LinkButton (nombre, clase, etc.)
- Asignaremos al LinkButton un CommandArgument igual al Identificador (DataKey) de esa fila del GridView
- Añadiremos el LinkButton a la celda, y la celda a la fila
Para ello utilizaremos el siguiente código:
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound Try ' Si se trata de una fila de datos... If e.Row.RowType = DataControlRowType.DataRow Then Dim celda As New TableCell() Dim boton As New LinkButton() boton.Text = "Detalles" If e.Row.Cells.Count > 1 Then boton.CommandArgument = GridView1.DataKeys(e.Row.RowIndex).Value.ToString() End If ' Añadimos el LinkButton a la celda, y la celda a la fila celda.Controls.Add(boton) e.Row.Controls.Add(celda) End If Catch ex As Exception Throw ex End Try End Sub
Con esto lograremos el buscado esquema [Botón] [CAMPOS] [Botón].