Suddivisione in pagine e ordinamento dei dati dei report (C#)

di Scott Mitchell

Scarica il PDF

Il paging e l'ordinamento sono due funzionalità molto comuni durante la visualizzazione dei dati in un'applicazione online. In questa esercitazione si esaminerà prima di tutto l'aggiunta dell'ordinamento e del paging ai report, che verranno quindi compilati nelle esercitazioni future.

Introduzione

Il paging e l'ordinamento sono due funzionalità molto comuni durante la visualizzazione dei dati in un'applicazione online. Ad esempio, quando si cerca ASP.NET libri in una libreria online, potrebbero esserci centinaia di tali libri, ma il report che elenca i risultati della ricerca elenca solo dieci corrispondenze per pagina. Inoltre, i risultati possono essere ordinati in base al titolo, al prezzo, al conteggio delle pagine, al nome dell'autore e così via. Anche se le ultime 23 esercitazioni hanno esaminato come creare un'ampia gamma di report, incluse le interfacce che consentono l'aggiunta, la modifica e l'eliminazione di dati, non abbiamo esaminato come ordinare i dati e gli unici esempi di paging che abbiamo visto sono stati con i controlli DetailsView e FormView.

In questa esercitazione verrà illustrato come aggiungere l'ordinamento e il paging ai report, operazione che può essere eseguita semplicemente selezionando alcune caselle di controllo. Sfortunatamente, questa implementazione semplicistica presenta i suoi svantaggi che l'interfaccia di ordinamento lascia un po'per essere desiderata e le routine di paging non sono progettate per il paging efficiente tramite set di risultati di grandi dimensioni. Le esercitazioni future illustrano come superare le limitazioni delle soluzioni predefinite per il paging e l'ordinamento.

Passaggio 1: Aggiunta del paging e dell'ordinamento delle pagine Web dell'esercitazione

Prima di iniziare questa esercitazione, è prima necessario aggiungere le pagine ASP.NET necessarie per questa esercitazione e le tre successive. Per iniziare, creare una nuova cartella nel progetto denominato PagingAndSorting. Aggiungere quindi le cinque pagine di ASP.NET seguenti a questa cartella, con tutte le pagine configurate per l'uso della pagina Site.mastermaster :

  • Default.aspx
  • SimplePagingSorting.aspx
  • EfficientPaging.aspx
  • SortParameter.aspx
  • CustomSortingUI.aspx

Creare una cartella PagingAndSorting e aggiungere l'esercitazione ASP.NET pagine

Figura 1: Creare una cartella PagingAndSorting e aggiungere l'esercitazione ASP.NET pagine

Aprire quindi la Default.aspx pagina e trascinare il SectionLevelTutorialListing.ascx controllo utente dalla UserControls cartella nell'area di progettazione. Questo controllo utente, creato nell'esercitazione Pagine master e navigazione sito, enumera la mappa del sito e visualizza tali esercitazioni nella sezione corrente in un elenco puntato.

Aggiungere il controllo utente SectionLevelTutorialListing.ascx a Default.aspx

Figura 2: Aggiungere il controllo Utente SectionLevelTutorialListing.ascx a Default.aspx

Per fare in modo che l'elenco puntato visualizzi le esercitazioni di paging e ordinamento che verranno create, è necessario aggiungerle alla mappa del sito. Aprire il Web.sitemap file e aggiungere il markup seguente dopo la modifica, l'inserimento e l'eliminazione del markup del nodo della mappa del sito:

<siteMapNode title="Paging and Sorting" url="~/PagingAndSorting/Default.aspx"
    description="Samples of Reports that Provide Paging and Sorting Capabilities">
    <siteMapNode url="~/PagingAndSorting/SimplePagingSorting.aspx"
        title="Simple Paging & Sorting Examples"
        description="Examines how to add simple paging and sorting support." />
    <siteMapNode url="~/PagingAndSorting/EfficientPaging.aspx"
        title="Efficiently Paging Through Large Result Sets"
        description="Learn how to efficiently page through large result sets." />
    <siteMapNode url="~/PagingAndSorting/SortParameter.aspx"
        title="Sorting Data at the BLL or DAL"
        description="Illustrates how to perform sorting logic in the Business Logic
        Layer or Data Access Layer." />
    <siteMapNode url="~/PagingAndSorting/CustomSortingUI.aspx"
        title="Customizing the Sorting User Interface"
        description="Learn how to customize and improve the sorting user interface." />
</siteMapNode>

Aggiornare la mappa del sito in modo da includere le nuove pagine di ASP.NET

Figura 3: Aggiornare la mappa del sito per includere le nuove pagine di ASP.NET

Passaggio 2: Visualizzazione delle informazioni sul prodotto in un controllo GridView

Prima di implementare effettivamente le funzionalità di paging e ordinamento, creare prima di tutto un controllo GridView non ordinabile standard non impaginabile che elenca le informazioni sul prodotto. Questa è un'attività eseguita molte volte prima di questa serie di esercitazioni, in modo che questi passaggi debbano essere familiari. Per iniziare, aprire la SimplePagingSorting.aspx pagina e trascinare un controllo GridView dalla casella degli strumenti nella Designer, impostandone la ID proprietà su Products. Creare quindi un nuovo ObjectDataSource che usa il metodo della GetProducts() classe ProductsBLL per restituire tutte le informazioni sul prodotto.

Recuperare informazioni su tutti i prodotti utilizzando il metodo GetProducts()

Figura 4: Recuperare informazioni su tutti i prodotti usando il metodo GetProducts()

Poiché questo report è di sola lettura, non è necessario eseguire il mapping dei metodi ObjectDataSource s Insert(), Update()o Delete() ai metodi corrispondenti ProductsBLL , quindi scegliere (Nessuno) dall'elenco a discesa per le schede UPDATE, INSERT e DELETE.

Scegliere l'opzione (Nessuno) nell'elenco Drop-Down nelle schede UPDATE, INSERT e DELETE

Figura 5: Scegliere l'opzione (nessuno) nell'elenco Drop-Down nelle schede UPDATE, INSERT e DELETE

Successivamente, è possibile personalizzare i campi gridView in modo che vengano visualizzati solo i nomi, i fornitori, le categorie, i prezzi e gli stati sospesi. Inoltre, è possibile apportare modifiche alla formattazione a livello di campo, ad esempio regolare le HeaderText proprietà o formattare il prezzo come valuta. Dopo queste modifiche, il markup dichiarativo di GridView dovrebbe essere simile al seguente:

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
            ReadOnly="True" SortExpression="SupplierName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

La figura 6 mostra lo stato di avanzamento finora visualizzato tramite un browser. Si noti che la pagina elenca tutti i prodotti in una schermata, che mostra il nome, la categoria, il fornitore, il prezzo e lo stato sospeso di ogni prodotto.

Ognuno dei prodotti è elencato

Figura 6: Ogni prodotto è elencato (fare clic per visualizzare l'immagine a dimensione intera)

Passaggio 3: Aggiunta del supporto per il paging

L'elenco di tutti i prodotti in una schermata può causare l'overload delle informazioni per l'utente che usa i dati. Per rendere i risultati più gestibili, è possibile suddividere i dati in pagine più piccole di dati e consentire all'utente di scorrere i dati una pagina alla volta. A tale scopo, selezionare semplicemente la casella di controllo Abilita paging dallo smart tag gridView di GridView (imposta la proprietà truegridView su AllowPaging ).

Selezionare la casella di controllo Abilita paging per aggiungere il supporto per il paging

Figura 7: Selezionare la casella di controllo Abilita paging per aggiungere il supporto per il paging (fare clic per visualizzare l'immagine a dimensione intera)

L'abilitazione del paging limita il numero di record visualizzati per pagina e aggiunge un'interfaccia di paging a GridView. L'interfaccia di paging predefinita, illustrata nella figura 7, è una serie di numeri di pagina, consentendo all'utente di spostarsi rapidamente da una pagina di dati a un'altra. Questa interfaccia di paging dovrebbe avere un aspetto familiare, come si è visto quando si aggiunge il supporto per il paging ai controlli DetailsView e FormView nelle esercitazioni precedenti.

Entrambi i controlli DetailsView e FormView mostrano solo un singolo record per pagina. GridView, tuttavia, consulta la relativaPageSize proprietà per determinare il numero di record da visualizzare per pagina (per impostazione predefinita questa proprietà è pari a 10).

L'interfaccia di paging di GridView, DetailsView e FormView può essere personalizzata usando le proprietà seguenti:

  • PagerStyleindica le informazioni sullo stile per l'interfaccia di paging; può specificare impostazioni come BackColor, ForeColor, HorizontalAlignCssClass, e così via.

  • PagerSettings contiene una grande quantità di proprietà che possono personalizzare la funzionalità dell'interfaccia di paging; PageButtonCount indica il numero massimo di numeri di pagina numerici visualizzati nell'interfaccia di paging (il valore predefinito è 10); la Mode proprietà indica il funzionamento dell'interfaccia di paging e può essere impostata su:

    • NextPrevious mostra i pulsanti Avanti e Indietro, consentendo all'utente di andare avanti o indietro una pagina alla volta
    • NextPreviousFirstLast oltre ai pulsanti Avanti e Precedente, sono inclusi anche i pulsanti First e Last, consentendo all'utente di passare rapidamente alla prima o all'ultima pagina di dati
    • Numeric mostra una serie di numeri di pagina, consentendo all'utente di passare immediatamente a qualsiasi pagina
    • NumericFirstLast oltre ai numeri di pagina, include i pulsanti First e Last, consentendo all'utente di passare rapidamente alla prima o all'ultima pagina di dati; I pulsanti First/Last vengono visualizzati solo se non è possibile adattare tutti i numeri di pagina numerici

Inoltre, GridView, DetailsView e FormView offrono tutte le PageIndex proprietà e PageCount , che indicano rispettivamente la pagina corrente visualizzata e il numero totale di pagine di dati. La PageIndex proprietà viene indicizzata a partire da 0, ovvero quando si visualizza la prima pagina di dati PageIndex sarà uguale a 0. PageCount, d'altra parte, inizia il conteggio a 1, vale a dire che PageIndex è limitato ai valori compresi tra 0 e PageCount - 1.

Dedicare qualche minuto per migliorare l'aspetto predefinito dell'interfaccia di paging di GridView. In particolare, lasciare che l'interfaccia di paging sia allineata a destra con uno sfondo grigio chiaro. Invece di impostare queste proprietà direttamente tramite la proprietà gridView, PagerStyle è possibile creare una classe CSS in Styles.css denominata PagerRowStyle e quindi assegnare la PagerStyle proprietà s CssClass tramite il tema. Per iniziare, aprire Styles.css e aggiungere la definizione di classe CSS seguente:

.PagerRowStyle
{
    background-color: #ddd;
    text-align: right;
}

Aprire quindi il GridView.skin file nella DataWebControls cartella all'interno della App_Themes cartella . Come illustrato nell'esercitazione pagine master e navigazione nel sito , è possibile usare i file skin per specificare i valori predefiniti delle proprietà per un controllo Web. Di conseguenza, aumentare le impostazioni esistenti per includere l'impostazione della PagerStyle proprietà s CssClass su PagerRowStyle. Inoltre, è possibile configurare l'interfaccia di paging in modo da visualizzare al massimo cinque pulsanti di pagina numerici usando l'interfaccia NumericFirstLast di paging.

<asp:GridView runat="server" CssClass="DataWebControlStyle">
   <AlternatingRowStyle CssClass="AlternatingRowStyle" />
   <RowStyle CssClass="RowStyle" />
   <HeaderStyle CssClass="HeaderStyle" />
   <FooterStyle CssClass="FooterStyle" />
   <SelectedRowStyle CssClass="SelectedRowStyle" />
   <PagerStyle CssClass="PagerRowStyle" />
   <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" />
</asp:GridView>

Esperienza utente di paging

La figura 8 mostra la pagina Web quando viene visitata tramite un browser dopo che la casella di controllo Abilita paging di GridView è stata selezionata e le PagerStyle configurazioni e PagerSettings sono state effettuate tramite il GridView.skin file. Si noti che vengono visualizzati solo dieci record e l'interfaccia di paging indica che si sta visualizzando la prima pagina di dati.

Con il paging abilitato, solo un subset dei record viene visualizzato alla volta

Figura 8: con il paging abilitato, viene visualizzato solo un subset dei record alla volta (fare clic per visualizzare l'immagine a dimensione intera)

Quando l'utente fa clic su uno dei numeri di pagina nell'interfaccia di paging, viene eseguito un postback e la pagina viene ricaricata mostrando i record della pagina richiesti. La figura 9 mostra i risultati dopo aver scelto di visualizzare la pagina finale dei dati. Si noti che la pagina finale ha un solo record; questo perché ci sono 81 record in totale, ottenendo otto pagine di 10 record per pagina più una pagina con un record solitario.

Facendo clic su un numero di pagina viene generato un postback e viene visualizzato il subset di record appropriato

Figura 9: Facendo clic su un numero di pagina viene generato un postback e viene visualizzato il subset di record appropriato (fare clic per visualizzare l'immagine a dimensione intera)

Flusso di lavoro di paging Server-Side

Quando l'utente finale fa clic su un pulsante nell'interfaccia di paging, viene avviato un postback e inizia il flusso di lavoro sul lato server seguente:

  1. Viene generato l'evento GridView (o DetailsView o FormView) PageIndexChanging
  2. ObjectDataSource richiede nuovamente tutti i dati dal BLL; I valori delle proprietà e PageSize di PageIndex GridView vengono usati per determinare quali record restituiti dal BLL devono essere visualizzati in GridView
  3. Viene generato l'evento gridView PageIndexChanged

Nel passaggio 2, ObjectDataSource richiede nuovamente tutti i dati dall'origine dati. Questo stile di paging viene comunemente definito paging predefinito, perché è il comportamento di paging usato per impostazione predefinita quando si imposta la AllowPaging proprietà su true. Con il paging predefinito il controllo Web dei dati recupera in modo ingenuo tutti i record per ogni pagina di dati, anche se solo un subset di record viene effettivamente sottoposto a rendering nel codice HTML inviato al browser. A meno che i dati del database non vengano memorizzati nella cache da BLL o ObjectDataSource, il paging predefinito non è utilizzabile per set di risultati sufficientemente grandi o per le applicazioni Web con molti utenti simultanei.

Nell'esercitazione successiva verrà illustrato come implementare il paging personalizzato. Con il paging personalizzato è possibile indicare in modo specifico a ObjectDataSource di recuperare solo il set preciso di record necessari per la pagina di dati richiesta. Come si può immaginare, il paging personalizzato migliora notevolmente l'efficienza del paging tramite set di risultati di grandi dimensioni.

Nota

Anche se il paging predefinito non è adatto quando si esegue il paging in set di risultati sufficientemente grandi o per i siti con molti utenti simultanei, si rende conto che il paging personalizzato richiede più modifiche e sforzo per implementare e non è semplice come controllare una casella di controllo (come è il paging predefinito). Pertanto, il paging predefinito può essere la scelta ideale per siti Web di piccole dimensioni, a basso traffico o quando si esegue il paging attraverso set di risultati relativamente piccoli, in quanto è molto più semplice e rapido da implementare.

Ad esempio, se si sa che non saranno mai presenti più di 100 prodotti nel database, il miglioramento minimo delle prestazioni apprezzato dal paging personalizzato è probabilmente compensato dallo sforzo necessario per implementarlo. Se, tuttavia, è possibile che un giorno abbiano migliaia o decine di migliaia di prodotti, non implementando paging personalizzato sarebbe notevolmente impedita la scalabilità dell'applicazione.

Passaggio 4: Personalizzazione dell'esperienza di paging

I controlli Web dati forniscono una serie di proprietà che possono essere usate per migliorare l'esperienza di paging dell'utente. La PageCount proprietà, ad esempio, indica il numero di pagine totali presenti, mentre la PageIndex proprietà indica la pagina corrente visitata e può essere impostata per spostare rapidamente un utente in una pagina specifica. Per illustrare come usare queste proprietà per migliorare l'esperienza di paging dell'utente, è possibile aggiungere un controllo Web Label alla pagina che informa l'utente che sta visitando, insieme a un controllo DropDownList che consente di passare rapidamente a qualsiasi pagina specificata.

Per prima cosa, aggiungere un controllo Web Label alla pagina, impostarne la ID proprietà su PagingInformatione cancellarne la Text proprietà. Creare quindi un gestore eventi per l'evento GridView e DataBound aggiungere il codice seguente:

protected void Products_DataBound(object sender, EventArgs e)
{
    PagingInformation.Text = string.Format("You are viewing page {0} of {1}...",
        Products.PageIndex + 1, Products.PageCount);
}

Questo gestore eventi assegna la PagingInformation proprietà Label s Text a un messaggio che informa l'utente che sta attualmente visitando Products.PageIndex + 1 il numero di pagine Products.PageCount totali (si aggiunge 1 alla Products.PageIndex proprietà perché PageIndex è indicizzato a partire da 0). Ho scelto la proprietà assegna questa proprietà Label Text nel DataBound gestore eventi anziché al PageIndexChanged gestore eventi perché l'evento viene generato ogni volta che i DataBound dati vengono associati a GridView mentre il PageIndexChanged gestore eventi viene generato solo quando l'indice della pagina viene modificato. Quando GridView è inizialmente associato ai dati nella prima pagina visita, l'evento PageIndexChanging non viene generato (mentre l'evento DataBound viene eseguito).

Con questa aggiunta, l'utente viene ora visualizzato un messaggio che indica la pagina che visitano e il numero totale di pagine di dati presenti.

Vengono visualizzati il numero di pagina corrente e il numero totale di pagine

Figura 10: il numero di pagina corrente e il numero totale di pagine vengono visualizzati (fare clic per visualizzare l'immagine full-size)

Oltre al controllo Etichetta, consente di aggiungere anche un controllo DropDownList che elenca i numeri di pagina in GridView con la pagina attualmente visualizzata selezionata. L'idea è che l'utente può passare rapidamente dalla pagina corrente a un'altra selezionando semplicemente il nuovo indice di pagina dall'elenco a discesa. Iniziare aggiungendo un elenco a discesa al Designer, impostandone ID la proprietà PageList su e controllando l'opzione Abilita AutoPostBack dal relativo smart tag.

Tornare quindi al DataBound gestore eventi e aggiungere il codice seguente:

// Clear out all of the items in the DropDownList
PageList.Items.Clear();
// Add a ListItem for each page
for (int i = 0; i < Products.PageCount; i++)
{
    // Add the new ListItem
    ListItem pageListItem = new ListItem(string.Concat("Page ", i + 1), i.ToString());
    PageList.Items.Add(pageListItem);
    // select the current item, if needed
    if (i == Products.PageIndex)
        pageListItem.Selected = true;
}

Questo codice inizia cancellando gli elementi nell'elenco PageList a discesa. Questo può sembrare superfluo, poiché non si prevede che il numero di pagine venga modificato, ma altri utenti possono usare il sistema contemporaneamente, aggiungendo o rimuovendo record dalla Products tabella. Tali inserimenti o eliminazioni potrebbero modificare il numero di pagine di dati.

Successivamente, è necessario creare di nuovo i numeri di pagina e avere quello che esegue il mapping all'oggetto GridView PageIndex corrente selezionato per impostazione predefinita. Questa operazione viene eseguita con un ciclo compreso tra 0 e PageCount - 1, aggiungendo un nuovo ListItem oggetto in ogni iterazione e impostando la relativa Selected proprietà su true se l'indice di iterazione corrente equivale alla proprietà GridView.PageIndex

Infine, è necessario creare un gestore eventi per l'evento DropDownList SelectedIndexChanged , che viene generato ogni volta che l'utente sceglie un elemento diverso dall'elenco. Per creare questo gestore eventi, fare doppio clic su DropDownList nella Designer, quindi aggiungere il codice seguente:

protected void PageList_SelectedIndexChanged(object sender, EventArgs e)
{
    // Jump to the specified page
    Products.PageIndex = Convert.ToInt32(PageList.SelectedValue);
}

Come illustrato nella figura 11, la semplice modifica della proprietà GridView PageIndex causa il rebound dei dati in GridView. Nel gestore eventi di GridView viene DataBound selezionato l'elenco a discesa ListItem appropriato.

L'utente viene eseguito automaticamente nella sesta pagina quando si seleziona la pagina 6 Drop-Down elemento elenco

Figura 11: l'utente viene automaticamente preso nella sesta pagina quando si seleziona l'elemento elenco pagina 6 Drop-Down (fare clic per visualizzare l'immagine a dimensioni complete)

Passaggio 5: Aggiunta del supporto di ordinamento Bi-Directional

L'aggiunta del supporto di ordinamento bidirezionale è semplice come l'aggiunta del supporto per il paging, è sufficiente controllare l'opzione Abilita ordinamento dallo smart tag di GridView (che imposta la proprietà GridView s AllowSorting su true). In questo modo viene eseguito il rendering di ognuna delle intestazioni dei campi GridView s come LinkButtons che, quando si fa clic, causa un postback e restituisce i dati ordinati dalla colonna selezionata in ordine crescente. Facendo clic sulla stessa intestazione LinkButton, riordina nuovamente i dati in ordine decrescente.

Nota

Se si usa un livello di accesso dati personalizzato anziché un dataset tipizzato, potrebbe non essere disponibile un'opzione Abilita ordinamento nello smart tag di GridView. Solo GridViews associato a origini dati che supportano l'ordinamento in modo nativo hanno questa casella di controllo disponibile. Typed DataSet fornisce supporto per l'ordinamento out-of-the-box poiché l'ADO.NET DataTable fornisce un Sort metodo che, quando richiamato, ordina i DataRows di DataTable usando i criteri specificati.

Se il servizio di ordinamento non restituisce oggetti che supportano in modo nativo l'ordinamento, è necessario configurare ObjectDataSource per passare le informazioni di ordinamento al livello di logica di business, che può ordinare i dati o disporre dei dati ordinati da DAL. Verrà illustrato come ordinare i dati in Business Logic and Data Access Layer in un'esercitazione futura.

L'ordinamento di LinkButton viene eseguito come collegamenti ipertestuali HTML, i cui colori correnti (blu per un collegamento non visualizzato e un rosso scuro per un collegamento visitato) si scontrano con il colore di sfondo della riga di intestazione. Invece, consenti di avere tutti i collegamenti di riga di intestazione visualizzati in bianco, indipendentemente dal fatto che siano stati visitati o meno. Questa operazione può essere eseguita aggiungendo quanto segue alla Styles.css classe:

.HeaderStyle a, .HeaderStyle a:visited
{
    color: White;
}

Questa sintassi indica di usare il testo bianco durante la visualizzazione di tali collegamenti ipertestuali all'interno di un elemento che usa la classe HeaderStyle.

Dopo questa aggiunta CSS, quando si visita la pagina tramite un browser lo schermo dovrebbe essere simile alla figura 12. In particolare, la figura 12 mostra i risultati dopo che è stato fatto clic sul collegamento intestazione del campo Prezzo.

Screenshot della finestra Di ordinamento semplice & che mostra i risultati ordinati in base alla colonna Price in ordine crescente.

Figura 12: i risultati sono stati ordinati da UnitPrice nell'ordine crescente (fare clic per visualizzare l'immagine a dimensioni complete)

Esame del flusso di lavoro di ordinamento

Tutti i campi GridView, BoundField, CheckBoxField, TemplateField e così via hanno una SortExpression proprietà che indica l'espressione che deve essere usata per ordinare i dati quando viene fatto clic sul collegamento di intestazione di ordinamento del campo. GridView ha anche una SortExpression proprietà. Quando viene fatto clic su un'intestazione di ordinamento LinkButton, GridView assegna il valore del SortExpression campo alla relativa SortExpression proprietà. Successivamente, i dati vengono recuperati nuovamente dall'oggetto ObjectDataSource e ordinati in base alla proprietà GridView s SortExpression . L'elenco seguente illustra in dettaglio la sequenza di passaggi che traspiri quando un utente finale ordina i dati in Un controllo GridView:

  1. Viene generato l'evento di ordinamento di GridView
  2. La proprietà GridView s SortExpression è impostata sul campo del quale è stato fatto clic sull'intestazione SortExpression di ordinamento LinkButton
  3. ObjectDataSource recupera nuovamente tutti i dati dal BLL e quindi ordina i dati usando GridView s SortExpression
  4. La proprietà GridView s PageIndex viene reimpostata su 0, ovvero quando si ordina l'utente viene restituita alla prima pagina dei dati (presupponendo che sia stato implementato il supporto per il paging)
  5. Viene generato l'evento GridView Sorted

Come per il paging predefinito, l'opzione di ordinamento predefinito recupera tutti i record dal BLL. Quando si usa l'ordinamento senza paging o quando si usa l'ordinamento con il paging predefinito, non è possibile aggirare questo colpo di prestazioni (breve di memorizzazione nella cache dei dati del database). Tuttavia, come si vedrà in un'esercitazione futura, è possibile ordinare in modo efficiente i dati quando si usa il paging personalizzato.

Quando si associa un oggetto ObjectDataSource a GridView tramite l'elenco a discesa nello smart tag gridView, ogni campo GridView ha automaticamente la proprietà SortExpression assegnata al nome del campo dati nella ProductsRow classe. Ad esempio, l'oggetto ProductName BoundField s SortExpression è impostato su ProductName, come illustrato nel markup dichiarativo seguente:

<asp:BoundField DataField="ProductName" HeaderText="Product"
    SortExpression="ProductName" />

Un campo può essere configurato in modo che non sia ordinabile cancellando la relativa SortExpression proprietà (assegnandola a una stringa vuota). Per illustrare questo, immaginare che non volevamo lasciare che i nostri clienti ordinano i nostri prodotti in base al prezzo. La UnitPrice proprietà BoundField s SortExpression può essere rimossa dal markup dichiarativo o dalla finestra di dialogo Campi , accessibile facendo clic sul collegamento Modifica colonne nello smart tag gridView.

Screenshot della finestra Campi con Prezzo e SortExpression evidenziati.

Figura 13: i risultati sono stati ordinati da UnitPrice nell'ordine crescente

Dopo aver rimosso la SortExpression proprietà per BoundField, l'intestazione UnitPrice viene eseguita come testo anziché come collegamento, impedendo così agli utenti di ordinare i dati in base al prezzo.

Rimuovendo la proprietà SortExpression, gli utenti non possono più ordinare i prodotti per prezzo

Figura 14: Rimuovendo la proprietà SortExpression, gli utenti non possono più ordinare i prodotti per prezzo (fare clic per visualizzare l'immagine a dimensioni complete)

Ordinamento a livello di codice di GridView

È anche possibile ordinare il contenuto di GridView a livello di codice usando il metodo GridView.Sort È sufficiente passare il SortExpression valore per ordinare insieme SortDirection a (Ascending o Descending) e i dati di GridView verranno riordinati.

Si supponga che il motivo per cui abbiamo disattivato l'ordinamento in base al UnitPrice fatto che eravamo preoccupati che i nostri clienti acquistassero semplicemente solo i prodotti a prezzo più basso. Tuttavia, vogliamo incoraggiarli a comprare i prodotti più costosi, quindi vorremmo che possano ordinare i prodotti in base al prezzo, ma solo dal prezzo più costoso al minimo.

A tale scopo, aggiungere un controllo Web Button alla pagina, impostare la relativa proprietà su SortPriceDescendinge la relativa IDText proprietà su Ordina per prezzo. Creare quindi un gestore eventi per l'evento Button s Click facendo doppio clic sul controllo Pulsante nella Designer. Aggiungere il codice seguente al gestore eventi:

protected void SortPriceDescending_Click(object sender, EventArgs e)
{
    // Sort by UnitPrice in descending order
    Products.Sort("UnitPrice", SortDirection.Descending);
}

Facendo clic su questo pulsante, l'utente viene restituito alla prima pagina con i prodotti ordinati in base al prezzo, dal più costoso al meno costoso (vedere la figura 15).

Facendo clic sul pulsante Ordina i prodotti dal più costoso al minimo

Figura 15: fare clic sul pulsante Ordina i prodotti dal più costoso al minimo (fare clic per visualizzare l'immagine full-size)

Riepilogo

In questa esercitazione è stato illustrato come implementare le funzionalità di paging e ordinamento predefinite, entrambe le quali erano semplici come controllare una casella di controllo. Quando un utente ordina o pagine tramite dati, un flusso di lavoro simile si svolge:

  1. Un postback viene seguito
  2. Il controllo Web dei dati genera eventi prelivello (PageIndexChanging o Sorting)
  3. Tutti i dati vengono recuperati di nuovo da ObjectDataSource
  4. Viene generato l'evento post-livello del controllo Web dei dati (PageIndexChanged o Sorted)

Durante l'implementazione di paging di base e l'ordinamento è una brezza, è necessario esercitare più sforzo per utilizzare il paging personalizzato più efficiente o per migliorare ulteriormente l'interfaccia di paging o ordinamento. Le esercitazioni future esamineranno questi argomenti.

Programmazione felice!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato con le tecnologie Microsoft Web dal 1998. Scott lavora come consulente indipendente, allenatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2,0 in 24 Ore. Può essere raggiunto a mitchell@4GuysFromRolla.com. o tramite il suo blog, che può essere trovato in http://ScottOnWriting.NET.