2009-03-31 19 views
28

Estoy tratando de obtener una vista de cuadrícula para ordenar y paginar manualmente sin éxito.clasificación y paginación con gridview asp.net

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.

+0

Aquí hay un artículo de la clasificación de Gridview en el encabezado, haga clic en referirse http://codepedia.info/2013/05/gridview-sorting-header-click/ –

Respuesta

51

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 desea utilizar la funcionalidad de clasificación existente? Siempre puedes personalizarlo.

Sorting Data in a GridView Web Server Control en MSDN

Aquí se muestra un ejemplo con la personalización:

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

+0

Porque hay elementos en la tabla que no quiero que se muestren en el Gridview, así que los omito antes de pasar la tabla a la fuente de datos ... Y lo he intentado pero lo ordena en la columna inicial cuando se carga, pero la f páginas siguientes, mantenga esa clasificación, pero solo están ordenadas por la nueva columna – dangerisgo

+0

Nice answear Tarkus – Karamafrooz

5
<asp:GridView 
    ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true"> 
    <Columns> 
     <asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid" /> 
     <asp:BoundField DataField="bookname" HeaderText="BOOK NAME" /> 
     <asp:BoundField DataField="writer" HeaderText="WRITER" /> 
     <asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook" /> 
     <asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" /> 
    </Columns> 
</asp:GridView> 

Código atrá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; 
    } 
} 
0

he encontrado una manera mucho más fácil, lo que le permite seguir usando la clasificación/paginación incorporada de th e estándar gridview ...

crear 2 etiquetas. configúrelos para que sean visibles = falso Llamé a la mina y lblSort1 lblSortDirection1

luego de código 2 eventos simples ... la clasificación de página, que escribe en el texto de las etiquetas invisibles, y el cambio de índice de página, que los utiliza ...

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 el uso de variables globales, pero me he encontrado con ASP especialmente VARs globales son, así, poco fiable ...

0

Más manera sencilla ...:

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() 
0

Tar La respuesta de kus 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 existen otros métodos, como los perfiles de usuario persistentes.

recomiendo este artículo para obtener 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, SESIÓN y otras formas de persistencia de las variables, recomiendo este artículo : https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

Cuestiones relacionadas