Enlace via código de grillas en ASP.NETLunes, 03 may, 2010 @ 14:28 | Por Dario Krapp | ASP.NET |
Ordenamiento y paginación
La grilla ofrecerá además la posibilidad de ordenar la información mostrada por alguna columna, para activar esta característica deberá establecerse la propiedad AllowSorting del control GridView en verdadero y para cada columna por la que se desee ordenar la grilla deberá establecerse un valor para la propiedad SortExpression. Además deberá establecerse la propiedad HeaderText (si es que no se trata de una columna autogenerada) para establecer el nombre del encabezado, tal como se muestra a continuación:
<asp:GridView ... AllowSorting="true" <asp:BoundField DataField="Valor1" SortExpression="Valor1" HeaderText="Valor1" />
Luego de estas modificaciones notaremos que el encabezado de la columna modificada posee un enlace.

Si presionamos el enlace obtendremos un error indicando que el evento Sorting no ha sido manejado, si manejamos dicho evento notaremos que la función destinada a tal fin poseerá un parámetro denominado “e” del tipo GridViewSortEventArgs cuya propiedad SortExpression devolverá el valor establecido en la propiedad con el mismo nombre de la columna cliqueada. Para nuestro ejemplo obtendremos el valor “Valor1”.
La propiedad SortDirection no podremos utilizarla cuando establezcamos el origen de datos en la propiedad DataSource (como ya hemos comentado previamente, otra forma de establecer un origen de datos es utilizar la propiedad DataSourceID, aunque no veremos esta posibilidad en este articulo) pero podremos utilizar por ejemplo el Viewstate para almacenar la dirección del ordenamiento sin dificultades adicionales.
Otra de las características de la grilla es que brindará la posibilidad de mostrar los resultados paginados, para activar esta posibilidad, la grilla contará con la propiedad AllowPaging que deberá establecerse en verdadero.
Podrá también definirse el Tamaño de la página (a través de la propiedad PageSize, el valor por defecto es 10), la página actual podrá obtenerse y modificarse a través de la propiedad PageIndex (En base cero). En el siguiente ejemplo so muestra una definición posible:
<asp:GridView ... AllowSorting="true" PageSize="4" PageIndex="1" AllowPaging="true>

En el mismo puede observarse que los datos se muestran de a cuatro filas. También puede observarse el paginador que ha renderizado la grilla y en el mismo se distingue que la página seleccionada es la segunda. Si presionamos algún enlace del paginador obtendremos un error, dado que deberemos manejar el evento PageIndexChanging, si manejamos dicho evento veremos que la función destinada a tal fin poseerá un parámetro denominado “e” del tipo GridViewPageEventArgs, el mismo contará con la propiedad NewPageIndex donde el número de página cliqueado será pasado. Para que la grilla pase a la página solicitada simplemente deberemos establecer la propiedad PageIndex de la grilla con el valor pasado en la propiedad NewPageIndex del parámetro “e” y la paginación estará funcionando. A continuación se muestra un ejemplo:
(sender as GridView).PageIndex = e.NewPageIndex;
Un detalle interesante está relacionado con el ítem seleccionado en la grilla, la paginación y el ordenamiento y es que cuando una fila es seleccionada la misma quedará seleccionada aunque se modifique el ordenamiento o se cambie de página en la grilla, esto puede ser bastante confuso para el usuario, por lo que al cambiar de pagina u ordenar la grilla deberá controlarse manualmente la fila seleccionada, ya sea deseleccionando cualquier posible fila en un ordenamiento o paginación o buscando alguna metodología para mantener y refrescar el ítem seleccionado, a continuación se muestra un ejemplo donde, como seguramente sucederá en muchos ambientes de mundo real, se ha combinado la posibilidad de ordenar y filtrar una grilla conjuntamente:
protected void Page_Load(object sender, EventArgs
{
if (!Page.IsPostBack) ViewState["SortDirection"] = "ASC";
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
BindGrid(GV1);
}
...
......
protected void GV1_Sorting(object sender, GridViewSortEventArgs e)
{
string strSortExpression = ViewState["SortExpression"] as string;
string strSortDirection = ViewState["SortDirection"] as string;
if (strSortExpression == e.SortExpression)
strSortDirection = strSortDirection == "ASC" ? "DESC" : "ASC";
else
strSortDirection = "ASC";
ViewState["SortExpression"] = e.SortExpression;
ViewState["SortDirection"] = strSortDirection;
//Deselección de item
(sender as GridView).SelectedIndex = -1;
}
protected void GV1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
ViewState["PageIndex"] = e.NewPageIndex;
//Deselección de item
(sender as GridView).SelectedIndex = -1;
}
...
.......
private void BindGrid(GridView Grd)
{
string strSortExpression = ViewState["SortExpression"] as string;
string strSortDirection = ViewState["SortDirection"] as string;
int? intPageIndex = ViewState["PageIndex"] as int?;
string strCmdText = "SELECT * FROM GV_T1";
if (!string.IsNullOrEmpty(strSortExpression))
strCmdText = string.Format("SELECT * FROM GV_T1 ORDER BY {0} {1}", strSortExpression, strSortDirection);
if (intPageIndex.HasValue)
Grd.PageIndex = intPageIndex.Value;
using (SqlConnection SqlCn = new SqlConnection("Data Source=..."))
{
using (SqlCommand SqlCmd = new SqlCommand(strCmdText, SqlCn))
{
SqlCmd.Connection.Open();
SqlDataAdapter SqlDA = new SqlDataAdapter(SqlCmd);
DataSet DS = new DataSet();
SqlDA.Fill(DS, "T1_A");
Grd.DataSource = DS;
Grd.DataMember = "T1_A";
Grd.DataBind();
SqlCmd.Connection.Close();
}
}
}
Casi finalizado el artículo hemos conseguido enlazar el control GridView a varios orígenes de datos, emplear todos los tipos de columnas disponibles, modificar datos en la grilla y transferirlos al origen de datos, ordenar y paginar los datos en el control.
Un comentario es que será posible realizar estas tareas sin escribir código, para tal fin podrán utilizarse los controles SqlDataSource y ObjectDataSource. Lamentablemente estas posibilidades las dejaremos fuera del alcance este artículo.
Otro breve comentario, es que aunque no lo hemos visto en este artículo (ya que el mismo estaba enfocado específicamente a enlace) el control GridView ofrecerá una amplia funcionalidad para ajustar su apariencia, y contará incluso con formatos predefinidos a los cuales podrá accederse desde el diseñador en la opción “Auto Format”.
Con este último comentario le doy fin al artículo esperando, como siempre, que lo visto haya sido de utilidad. Dejo también un proyecto (en Visual Studio 2010) con algunos ejemplos.
Reciente








Miércoles, 02 mayo, 2012 a las 20:13
Muy buen aporte, gracias, me sirvió mucho tu idea. Saludos.