clasificación y paginación con gridview asp.net

Estoy tratando de obtener una vista de cuadrícula para ordenar y página manualmente sin éxito.

El problema es que cuando un usuario hace clic en la columna que desea ordenar, ordena esa página, pero no ordena el origen de datos (vista de datos) detrás de la vista de cuadrícula. Entonces cuando progresan a una página diferente, su tipo se pierde. Prácticamente estoy buscando un tipo que realmente clasifique la fuente de datos detrás de la vista de cuadrícula. Esto es lo que tengo hasta ahora:

protected void GridView_OnSort(object sender, GridViewSortEventArgs e) { String sortExpression = e.SortExpression; if (GridViewSortDirection == SortDirection.Ascending) { DataView myDataView = new DataView(mybll.GetItemsOrdered()); myDataView.Sort = sortExpression + " DESC"; GridView.DataSource = myDataView; GridView.DataBind(); } else { DataView myDataView = new DataView(mybll.GetItemsOrdered()); myDataView.Sort = sortExpression + " ASC"; GridView.DataSource = myDataView; GridView.DataBind(); } } 

Cualquier ayuda sería apreciada. Gracias.

Guarde su orden de clasificación en un ViewState.

 private const string ASCENDING = " ASC"; private const string DESCENDING = " DESC"; public SortDirection GridViewSortDirection { get { if (ViewState["sortDirection"] == null) ViewState["sortDirection"] = SortDirection.Ascending; return (SortDirection) ViewState["sortDirection"]; } set { ViewState["sortDirection"] = value; } } protected void GridView_Sorting(object sender, GridViewSortEventArgs e) { string sortExpression = e.SortExpression; if (GridViewSortDirection == SortDirection.Ascending) { GridViewSortDirection = SortDirection.Descending; SortGridView(sortExpression, DESCENDING); } else { GridViewSortDirection = SortDirection.Ascending; SortGridView(sortExpression, ASCENDING); } } private void SortGridView(string sortExpression,string direction) { // You can cache the DataTable for improving performance DataTable dt = GetData().Tables[0]; DataView dv = new DataView(dt); dv.Sort = sortExpression + direction; GridView1.DataSource = dv; GridView1.DataBind(); } 

¿Por qué no quieres usar la funcionalidad de clasificación existente? Siempre puedes personalizarlo.

Clasificación de datos en un control de servidor web GridView en MSDN

Aquí hay un ejemplo con personalización:

http://www.netomatix.com/development/GridViewSorting.aspx

          

Código detrás:

 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string query = "SELECT * FROM book"; DataTable DT = new DataTable(); SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon); DA.Fill(DT); GridView1.DataSource = DT; GridView1.DataBind(); } } protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) { string query = "SELECT * FROM book"; DataTable DT = new DataTable(); SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon); DA.Fill(DT); GridView1.DataSource = DT; GridView1.DataBind(); if (DT != null) { DataView dataView = new DataView(DT); dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); GridView1.DataSource = dataView; GridView1.DataBind(); } } private string GridViewSortDirection { get { return ViewState["SortDirection"] as string ?? "DESC"; } set { ViewState["SortDirection"] = value; } } private string ConvertSortDirectionToSql(SortDirection sortDirection) { switch (GridViewSortDirection) { case "ASC": GridViewSortDirection = "DESC"; break; case "DESC": GridViewSortDirection = "ASC"; break; } return GridViewSortDirection; } } 

Encontré una manera mucho más fácil, que le permite seguir utilizando la clasificación / paginación incorporada de la vista de cuadrícula estándar …

crea 2 tags configúrelos para que sean visibles = falso Llamé a los míos lblSort1 y lblSortDirection1

luego codifique 2 eventos simples … la clasificación de páginas, que escribe en el texto de las tags invisibles, y el cambio de índice de página, que las usa …

 Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting lblSort1.Text = e.SortExpression lblSortDirection1.Text = e.SortDirection End Sub Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text)) End Sub 

esto es un poco más descuidado que usar variables globales, pero he encontrado con asp especialmente que los vars globales son, bueno, poco confiables …

De manera más simple …

  Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable) Dim dv As New DataView(dt) If GridView1.Attributes("dir") = SortDirection.Ascending Then dv.Sort = e.SortExpression & " DESC" GridView1.Attributes("dir") = SortDirection.Descending Else GridView1.Attributes("dir") = SortDirection.Ascending dv.Sort = e.SortExpression & " ASC" End If GridView1.DataSource = dv GridView1.DataBind() 

La respuesta de Tarkus funciona bien. Sin embargo, sugiero reemplazar el VIEWSTATE con SESSION.

El VIEWSTATE de la página actual solo funciona mientras la página actual se devuelve a sí misma y desaparece una vez que el usuario es redirigido a otra página. SESSION persiste en el orden de clasificación en algo más que la posterior publicación de la página actual. Lo persiste durante toda la sesión. Esto significa que el usuario puede navegar a otras páginas, y cuando regresa a la página determinada, el orden de clasificación que utilizó por última vez aún permanece. Esto usualmente es más conveniente.

También hay otros métodos, como los perfiles de usuario persistentes.

Recomiendo este artículo para una muy buena explicación de ViewState y cómo funciona con el ciclo de vida de una página web: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Para comprender la diferencia entre VIEWSTATE, SESSION y otras formas de variables persistentes, recomiendo este artículo: https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx