ordinamento e paging con gridview asp.net

Sto cercando di ottenere una griglia per ordinare e pagina manualmente senza successo.

Il problema è che quando un utente fa clic sulla colonna che desidera ordinare, ordina quella pagina, ma non ordina l’origine dati (vista dati) dietro la griglia. Quindi quando avanzano verso una pagina diversa, il loro tipo è perso. Praticamente cercherò un tipo che in realtà metterà in ordine l’origine dati dietro il gridview. Ecco cosa ho finora:

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(); } } 

Qualsiasi aiuto sarebbe apprezzato. Grazie.

Salva il tuo ordine di smistamento in 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(); } 

Perché non vuoi utilizzare la funzionalità di ordinamento esistente? Puoi sempre personalizzarlo.

Ordinamento dei dati in un controllo server Web GridView su MSDN

Ecco un esempio con personalizzazione:

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

          

Codice dietro:

 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; } } 

Ho trovato un modo molto più semplice, che ti permette di usare ancora l’ordinamento / paging integrato del gridview standard …

crea 2 etichette. impostali per essere visibili = false. Ho chiamato il mio lblSort1 e lblSortDirection1

quindi codifica 2 eventi semplici … l’ordinamento della pagina, che scrive sul testo delle etichette invisibili e l’indice della pagina che cambia, che li 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 

questo è un po ‘più scadente rispetto all’utilizzo di variabili globali, ma ho trovato con asp soprattutto che le vars globali sono, beh, inaffidabili …

Modo più semplice …:

  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 risposta di Tarkus funziona bene. Tuttavia, suggerirei di sostituire VIEWSTATE con SESSION.

VIEWSTATE della pagina corrente funziona solo mentre la pagina corrente torna su se stessa e scompare quando l’utente viene reindirizzato su un’altra pagina. SESSIONE persiste nell’ordinamento su più del semplice post-back della pagina corrente. Lo persiste per tutta la durata della sessione. Ciò significa che l’utente può navigare su altre pagine e quando ritorna alla pagina specificata, rimane ancora l’ordinamento che ha usato l’ultima volta. Questo di solito è più conveniente.

Esistono anche altri metodi, come i profili utente persistenti.

Raccomando questo articolo per un’ottima spiegazione di ViewState e come funziona con il ciclo di vita di una pagina web: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Per comprendere la differenza tra VIEWSTATE, SESSION e altri modi di persistenza delle variabili, consiglio questo articolo: https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx