Suddivisione in pagine dei dati dei report in un controllo DataList o Repeater (VB)

di Scott Mitchell

Scarica il PDF

Mentre né DataList né Repeater offrono il supporto automatico di paging o ordinamento, questa esercitazione illustra come aggiungere il supporto di paging all'oggetto DataList o Repeater, che consente di visualizzare interfacce di paging e dati molto più flessibili.

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 un booktore online, potrebbero esserci centinaia di libri, ma il report 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. Come illustrato nell'esercitazione Relativa al paging e all'ordinamento dei dati del report , i controlli GridView, DetailsView e FormView forniscono tutti il supporto di paging predefinito che può essere abilitato al segno di spunta di una casella di controllo. GridView include anche il supporto per l'ordinamento.

Sfortunatamente, né DataList né Repeater offrono il supporto automatico di paging o ordinamento. In questa esercitazione verrà illustrato come aggiungere il supporto per il paging a DataList o Repeater. È necessario creare manualmente l'interfaccia di paging, visualizzare la pagina appropriata dei record e ricordare che la pagina viene visitata tra postback. Anche se ciò richiede più tempo e codice rispetto a GridView, DetailsView o FormView, DataList e Repeater consentono di visualizzare interfacce di paging e dati molto più flessibili.

Nota

Questa esercitazione si concentra esclusivamente sul paging. Nell'esercitazione successiva si esaminerà l'attenzione per aggiungere funzionalità di ordinamento.

Passaggio 1: Aggiunta di pagine Web di paging e ordinamento

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

  • Default.aspx
  • Paging.aspx
  • Sorting.aspx
  • SortingWithDefaultPaging.aspx
  • SortingWithCustomPaging.aspx

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

Figura 1: Creare una PagingSortingDataListRepeater cartella e aggiungere le pagine di esercitazione ASP.NET

Aprire quindi la Default.aspx pagina e trascinare il SectionLevelTutorialListing.ascx controllo utente dalla UserControls cartella nell'area Progettazione. Questo controllo utente, creato nell'esercitazione Di spostamento pagine master e 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 a Default.aspx (Fare clic per visualizzare l'immagineSectionLevelTutorialListing.ascx full-size)

Per visualizzare l'elenco puntato, verranno visualizzate le esercitazioni di paging e ordinamento che verranno create, è necessario aggiungerle alla mappa del sito. Aprire il file e aggiungere il Web.sitemap markup seguente dopo la modifica e l'eliminazione con il markup del nodo mappa del sito DataList:

<siteMapNode
    url="~/PagingSortingDataListRepeater/Default.aspx"
    title="Paging and Sorting with the DataList and Repeater"
    description="Paging and Sorting the Data in the DataList and Repeater Controls">
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Paging.aspx"
        title="Paging"
        description="Learn how to page through the data shown
                     in the DataList and Repeater controls." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Sorting.aspx"
        title="Sorting"
        description="Sort the data displayed in a DataList or
                     Repeater control." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithDefaultPaging.aspx"
        title="Sorting with Default Paging"
        description="Create a DataList or Repeater control that is paged using
                     default paging and can be sorted." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithCustomPaging.aspx"
        title="Sorting with Custom Paging"
        description="Learn how to sort the data displayed in a DataList or
                     Repeater control that uses custom paging." />
</siteMapNode>

Aggiornare la mappa del sito per includere le nuove pagine ASP.NET

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

Revisione del paging

Nelle esercitazioni precedenti è stato illustrato come visualizzare i dati nei controlli GridView, DetailsView e FormView. Questi tre controlli offrono una semplice forma di paging denominata paging predefinito che può essere implementata semplicemente controllando l'opzione Abilita paging nello smart tag del controllo. Con il paging predefinito, ogni volta che viene richiesta una pagina di dati nella prima pagina visita o quando l'utente passa a una pagina diversa di dati, il controllo GridView, DetailsView o FormView richiede nuovamente tutti i dati da ObjectDataSource. Esegue quindi l'interruzione del set specifico di record da visualizzare in base all'indice di pagina richiesto e al numero di record da visualizzare per pagina. Il paging predefinito è stato illustrato in dettaglio nell'esercitazione Relativa al paging e all'ordinamento dei dati del report .

Poiché il paging predefinito richiede nuovamente tutti i record per ogni pagina, non è pratico quando si esegue il paging in quantità sufficientemente elevata di dati. Si supponga, ad esempio, di eseguire il paging di 50.000 record con dimensioni di pagina pari a 10. Ogni volta che l'utente passa a una nuova pagina, tutti i 50.000 record devono essere recuperati dal database, anche se vengono visualizzati solo dieci di essi.

Il paging personalizzato risolve i problemi di prestazioni del paging predefinito afferrando solo il subset preciso di record da visualizzare nella pagina richiesta. Quando si implementa il paging personalizzato, è necessario scrivere la query SQL che restituirà in modo efficiente solo il set corretto di record. È stato illustrato come creare una query di questo tipo usando SQL Server 2005 di nuovo la nuova ROW_NUMBER() parola chiave nell'esercitazione Di paging efficiente tramite grandi quantità di dati.

Per implementare il paging predefinito nei controlli DataList o Repeater, è possibile usare la classe come wrapper intorno al PagedDataSourceProductsDataTable cui contenuto viene eseguito la pagina. La PagedDataSource classe ha una DataSource proprietà che può essere assegnata a qualsiasi oggetto enumerabile e PageSizeCurrentPageIndex proprietà che indicano il numero di record da visualizzare per pagina e l'indice della pagina corrente. Dopo aver impostato queste proprietà, è PagedDataSource possibile usare come origine dati di qualsiasi controllo Web dati. Se PagedDataSourceenumerato, restituirà solo il subset appropriato di record interni DataSource in base alle PageSize proprietà e CurrentPageIndex . La figura 4 illustra la funzionalità della PagedDataSource classe.

PagedDataSource esegue il wrapping di un oggetto Enumerable con un'interfaccia paginabile

Figura 4: Esegue il wrapping di un oggetto enumerabile con un'interfaccia PagedDataSource paginabile

L'oggetto PagedDataSource può essere creato e configurato direttamente dal livello della logica di business e associato a un oggetto DataList o Repeater tramite ObjectDataSource oppure può essere creato e configurato direttamente nella classe code-behind della pagina ASP.NET. Se viene usato quest'ultimo approccio, è necessario usare ObjectDataSource e associare invece i dati di pagina a DataList o Repeater a livello di codice.

L'oggetto PagedDataSource include anche proprietà per supportare il paging personalizzato. Tuttavia, è possibile ignorare l'uso di un PagedDataSource oggetto per il paging personalizzato perché sono già presenti metodi BLL nella ProductsBLL classe progettati per il paging personalizzato che restituiscono i record precisi da visualizzare.

In questa esercitazione si esaminerà l'implementazione del paging predefinito in un oggetto DataList aggiungendo un nuovo metodo alla ProductsBLL classe che restituisce un oggetto configurato PagedDataSource in modo appropriato. Nell'esercitazione successiva verrà illustrato come usare il paging personalizzato.

Passaggio 2: Aggiunta di un metodo di paging predefinito nel livello della logica di business

La ProductsBLL classe ha attualmente un metodo per restituire tutte le informazioni GetProducts() sul prodotto e una per restituire un determinato subset di prodotti in corrispondenza di un indice GetProductsPaged(startRowIndex, maximumRows)iniziale . Con il paging predefinito, GridView, DetailsView e FormView tutti usano il GetProducts() metodo per recuperare tutti i prodotti, ma quindi usare un PagedDataSource oggetto internamente per visualizzare solo il subset corretto di record. Per replicare questa funzionalità con i controlli DataList e Repeater, è possibile creare un nuovo metodo nel BLL che simula questo comportamento.

Aggiungere un metodo alla ProductsBLL classe denominata GetProductsAsPagedDataSource che accetta due parametri di input integer:

  • pageIndex indice della pagina da visualizzare, indicizzato a zero e
  • pageSize numero di record da visualizzare per pagina.

GetProductsAsPagedDataSource inizia recuperando tutti i record da GetProducts(). Crea quindi un PagedDataSource oggetto, impostandone CurrentPageIndex le proprietà e PageSize sui valori dei parametri e pageSize passatipageIndex. Il metodo termina restituendo questa configurazione PagedDataSource:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsAsPagedDataSource(ByVal pageIndex As Integer, _
    ByVal pageSize As Integer) As PagedDataSource
    ' Get ALL of the products
    Dim products As Northwind.ProductsDataTable = GetProducts()
    ' Limit the results through a PagedDataSource
    Dim pagedData As New PagedDataSource()
    pagedData.DataSource = products.Rows
    pagedData.AllowPaging = True
    pagedData.CurrentPageIndex = pageIndex
    pagedData.PageSize = pageSize
    Return pagedData
End Function

Passaggio 3: Visualizzazione delle informazioni sul prodotto in un elenco dati usando il paging predefinito

Con il GetProductsAsPagedDataSource metodo aggiunto alla ProductsBLL classe, è ora possibile creare un oggetto DataList o Repeater che fornisce il paging predefinito. Iniziare aprendo la Paging.aspx pagina nella PagingSortingDataListRepeater cartella e trascinando un oggetto DataList dalla casella degli strumenti nella Designer, impostando la proprietà ProductsDefaultPagingDataList su ID . Dallo smart tag di DataList creare un nuovo oggetto ObjectDataSource denominato ProductsDefaultPagingDataSource e configurarlo in modo da recuperare i dati usando il GetProductsAsPagedDataSource metodo .

Creare un oggetto ObjectDataSource e configurarlo per usare il metodo GetProductsAsPagedDataSource ()

Figura 5: Creare un oggetto ObjectDataSource e configurarlo per usare il metodo (fare clic per visualizzare l'immagineGetProductsAsPagedDataSource() a dimensioni complete)

Impostare gli elenchi a discesa nelle schede UPDATE, INSERT e DELETE su (Nessuno).

Impostare la Drop-Down Elenchi nelle schede UPDATE, INSERT e DELETE su (Nessuno)

Figura 6: Impostare la Drop-Down Elenchi nelle schede UPDATE, INSERT e DELETE su (Nessuno) (Fare clic per visualizzare l'immagine a dimensioni complete)

Poiché il metodo prevede due parametri di input, la GetProductsAsPagedDataSource procedura guidata richiede l'origine di questi valori di parametro.

I valori di indice di pagina e dimensione pagina devono essere ricordati tra postback. Possono essere archiviati nello stato di visualizzazione, mantenuti nella querystring, archiviati nelle variabili di sessione o memorizzati usando alcune altre tecniche. Per questa esercitazione verrà usata la querystring, che offre il vantaggio di consentire l'aggiunta di segnalibri a una determinata pagina di dati.

In particolare, usare i campi querystring pageIndex e pageSize per i pageIndex parametri e pageSize rispettivamente (vedere la figura 7). Per impostare i valori predefiniti per questi parametri, i valori querystring non saranno presenti quando un utente visita questa pagina. Per pageIndex, impostare il valore predefinito su 0 (che mostrerà la prima pagina di dati) e pageSize il valore predefinito su 4.

Usare QueryString come origine per i parametri pageIndex e pageSize

Figura 7: Usare QueryString come origine per i pageIndex parametri e pageSize (fare clic per visualizzare l'immagine full-size)

Dopo aver configurato ObjectDataSource, Visual Studio crea automaticamente un ItemTemplate oggetto per DataList. Personalizzare in ItemTemplate modo che vengano visualizzati solo il nome, la categoria e il fornitore del prodotto. Impostare anche la proprietà DataList s RepeatColumns su 2, su 100%, Width e su ItemStyleWidth 50%. Queste impostazioni di larghezza forniscono spaziatura uguale per le due colonne.

Dopo aver apportato queste modifiche, il markup di DataList e ObjectDataSource dovrebbe essere simile al seguente:

<asp:DataList ID="ProductsDefaultPaging" runat="server" Width="100%"
    DataKeyField="ProductID" DataSourceID="ProductsDefaultPagingDataSource"
    RepeatColumns="2" EnableViewState="False">
    <ItemTemplate>
        <h4><asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>'></asp:Label></h4>
        Category:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Eval("CategoryName") %>'></asp:Label><br />
        Supplier:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Eval("SupplierName") %>'></asp:Label><br />
        <br />
        <br />
    </ItemTemplate>
    <ItemStyle Width="50%" />
</asp:DataList>
<asp:ObjectDataSource ID="ProductsDefaultPagingDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsAsPagedDataSource">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="0" Name="pageIndex"
             QueryStringField="pageIndex" Type="Int32" />
        <asp:QueryStringParameter DefaultValue="4" Name="pageSize"
             QueryStringField="pageSize" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Nota

Poiché non si esegue alcuna funzionalità di aggiornamento o eliminazione in questa esercitazione, è possibile disabilitare lo stato di visualizzazione di DataList per ridurre le dimensioni della pagina di rendering.

Quando si visita inizialmente questa pagina tramite un browser, non vengono forniti né i pageIndexpageSize parametri querystring. Di conseguenza, vengono usati i valori predefiniti 0 e 4. Come illustrato nella figura 8, si ottiene un oggetto DataList che visualizza i primi quattro prodotti.

I primi quattro prodotti sono elencati

Figura 8: i primi quattro prodotti sono elencati (fare clic per visualizzare l'immagine full-size)

Senza un'interfaccia di paging, non esiste attualmente alcun mezzo semplice per un utente per passare alla seconda pagina di dati. Verrà creata un'interfaccia di paging nel passaggio 4. Per il momento, tuttavia, il paging può essere eseguito solo specificando direttamente i criteri di paging nella stringa di query. Ad esempio, per visualizzare la seconda pagina, modificare l'URL nella barra degli indirizzi del browser da Paging.aspx a Paging.aspx?pageIndex=2 e premere INVIO. In questo modo viene visualizzata la seconda pagina di dati (vedere la figura 9).

Screenshot dei dati di paging in una finestra DataList che mostra la seconda pagina di dati.

Figura 9: Viene visualizzata la seconda pagina di dati (fare clic per visualizzare l'immagine a dimensione intera)

Passaggio 4: Creazione dell'interfaccia di paging

È possibile implementare diverse interfacce di paging. I controlli GridView, DetailsView e FormView offrono quattro interfacce diverse tra cui scegliere:

  • Successivamente, gli utenti precedenti possono spostare una pagina alla volta, alla successiva o precedente.
  • Successivamente, Indietro, Primo, Ultimo oltre ai pulsanti Avanti e Indietro, questa interfaccia include i pulsanti First e Last per passare alla prima o all'ultima pagina.
  • Numeric elenca i numeri di pagina nell'interfaccia di paging, consentendo a un utente di passare rapidamente a una determinata pagina.
  • Numeric, First, Last oltre ai numeri di pagina numerici, include pulsanti per passare alla prima o all'ultima pagina.

Per DataList e Repeater, siamo responsabili della scelta di un'interfaccia di paging e dell'implementazione. Ciò comporta la creazione dei controlli Web necessari nella pagina e la visualizzazione della pagina richiesta quando si fa clic su un particolare pulsante di interfaccia di paging. Inoltre, alcuni controlli dell'interfaccia di paging potrebbero essere disabilitati. Ad esempio, quando si visualizza la prima pagina di dati usando l'interfaccia Avanti, Precedente, Prima, Ultima, entrambi i pulsanti First e Previous vengono disabilitati.

Per questa esercitazione, usare l'interfaccia Avanti, Precedente, Prima, Ultima. Aggiungere quattro controlli Web Button alla pagina e impostarne ID i valori su FirstPage, PrevPage, NextPagee LastPage. Impostare le Text proprietà su << First, < Prev, Next >e Last >> .

<asp:Button runat="server" ID="FirstPage" Text="<< First" />
<asp:Button runat="server" ID="PrevPage" Text="< Prev" />
<asp:Button runat="server" ID="NextPage" Text="Next >" />
<asp:Button runat="server" ID="LastPage" Text="Last >>" />

Creare quindi un Click gestore eventi per ognuno di questi pulsanti. In un momento verrà aggiunto il codice necessario per visualizzare la pagina richiesta.

Memorizzazione del numero totale di record sottoposti a paging

Indipendentemente dall'interfaccia di paging selezionata, è necessario calcolare e ricordare il numero totale di record sottoposti a paging. Il numero totale di righe (in combinazione con le dimensioni della pagina) determina il numero totale di pagine di dati di cui viene eseguito il paging, che determina i controlli dell'interfaccia di paging aggiunti o abilitati. Nell'interfaccia Next, Previous, First, Last che si sta creando, il conteggio delle pagine viene usato in due modi:

  • Per determinare se si sta visualizzando l'ultima pagina, nel qual caso i pulsanti Avanti e Ultimo sono disabilitati.
  • Se l'utente fa clic sul pulsante Ultimo, è necessario eseguirne il whisking nell'ultima pagina, il cui indice è uno minore del numero di pagine.

Il conteggio delle pagine viene calcolato come limite massimo del conteggio totale delle righe diviso per le dimensioni della pagina. Ad esempio, se si esegue il paging tra 79 record con quattro record per pagina, il numero di pagine è 20 (il limite massimo di 79/ 4). Se si usa l'interfaccia di paging numerico, queste informazioni ci informano sul numero di pulsanti di pagina numerici da visualizzare; se l'interfaccia di paging include pulsanti Avanti o Ultima, il conteggio delle pagine viene usato per determinare quando disabilitare i pulsanti Avanti o Ultima.

Se l'interfaccia di paging include un pulsante Ultimo, è fondamentale che il numero totale di record sottoposti a paging venga memorizzato tra i postback, in modo che quando si fa clic sul pulsante Ultimo è possibile determinare l'ultimo indice di pagina. Per semplificare questa operazione, creare una TotalRowCount proprietà nella classe code-behind della pagina ASP.NET che ne rende persistente il valore per visualizzare lo stato:

Private Property TotalRowCount() As Integer
    Get
        Dim o As Object = ViewState("TotalRowCount")
        If (o Is Nothing) Then
            Return -1
        Else
            Return Convert.ToInt32(o)
        End If
    End Get
    set(Value as Integer)
        ViewState("TotalRowCount") = value
    End Set
End Property

Oltre a TotalRowCount, è necessario un minuto per creare proprietà a livello di pagina di sola lettura per accedere facilmente all'indice di pagina, alle dimensioni della pagina e al numero di pagine:

Private ReadOnly Property PageIndex() As Integer
    Get
        If (Not String.IsNullOrEmpty(Request.QueryString("pageIndex"))) Then
            Return Convert.ToInt32(Request.QueryString("pageIndex"))
        Else
            Return 0
        End If
    End Get
End Property
Private ReadOnly Property PageSize() As Integer
    Get
        If (Not String.IsNullOrEmpty(Request.QueryString("pageSize"))) Then
            Return Convert.ToInt32(Request.QueryString("pageSize"))
        Else
            Return 4
        End If
    End Get
End Property
Private ReadOnly Property PageCount() As Integer
    Get
        If TotalRowCount <= 0 OrElse PageSize <= 0 Then
            Return 1
        Else
            Return ((TotalRowCount + PageSize) - 1) / PageSize
        End If
    End Get
End Property

Determinazione del numero totale di record sottoposti a paging

L'oggetto PagedDataSource restituito dal metodo ObjectDataSource contiene Select()tutti i record del prodotto, anche se solo un sottoinsieme di essi viene visualizzato in DataList. La PagedDataSource proprietà s Count restituisce solo il numero di elementi che verranno visualizzati in DataList. La DataSourceCount proprietà restituisce il numero totale di elementi all'interno di PagedDataSource. Pertanto, è necessario assegnare la proprietà della pagina TotalRowCount ASP.NET il valore della PagedDataSource proprietà s DataSourceCount .

A tale scopo, creare un gestore eventi per l'evento ObjectDataSource.Selected Selected Nel gestore eventi è possibile accedere al valore restituito del metodo ObjectDataSource in Select() questo caso, .PagedDataSource

Protected Sub ProductsDefaultPagingDataSource_Selected(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) _
    Handles ProductsDefaultPagingDataSource.Selected
    ' Reference the PagedDataSource bound to the DataList
    Dim pagedData As PagedDataSource = CType(e.ReturnValue, PagedDataSource)
    ' Remember the total number of records being paged through across postbacks
    TotalRowCount = pagedData.DataSourceCount
End Sub

Visualizzazione della pagina dei dati richiesta

Quando l'utente fa clic su uno dei pulsanti nell'interfaccia di paging, è necessario visualizzare la pagina dei dati richiesta. Poiché i parametri di paging vengono specificati tramite la stringa di query, per visualizzare la pagina richiesta di dati utilizzata Response.Redirect(url) per richiedere nuovamente la Paging.aspx pagina al browser dell'utente con i parametri di paging appropriati. Ad esempio, per visualizzare la seconda pagina di dati, l'utente verrà reindirizzato a Paging.aspx?pageIndex=1.

Per facilitare questa operazione, creare un RedirectUser(sendUserToPageIndex) metodo che reindirizza l'utente a Paging.aspx?pageIndex=sendUserToPageIndex. Chiamare quindi questo metodo dai quattro gestori eventi Button Click . FirstPageClick Nel gestore eventi chiamare RedirectUser(0), per inviarli alla prima pagina, nelClickPrevPagegestore eventi usare PageIndex - 1 come indice di pagina e così via.

Protected Sub FirstPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles FirstPage.Click
    ' Send the user to the first page
    RedirectUser(0)
End Sub
Protected Sub PrevPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles PrevPage.Click
    ' Send the user to the previous page
    RedirectUser(PageIndex - 1)
End Sub
Protected Sub NextPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles NextPage.Click
    ' Send the user to the next page
    RedirectUser(PageIndex + 1)
End Sub
Protected Sub LastPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles LastPage.Click
    ' Send the user to the last page
    RedirectUser(PageCount - 1)
End Sub
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer)
    ' Send the user to the requested page
    Response.Redirect(String.Format("Paging.aspx?pageIndex={0}&pageSize={1}", _
        sendUserToPageIndex, PageSize))
End Sub

Al termine dei Click gestori eventi, è possibile scorrere i record di DataList facendo clic sui pulsanti. Prenditi un attimo per provarlo!

Disabilitazione dei controlli dell'interfaccia di paging

Attualmente, tutti e quattro i pulsanti sono abilitati indipendentemente dalla pagina visualizzata. Tuttavia, si vogliono disabilitare i pulsanti First e Previous quando vengono visualizzati la prima pagina di dati e i pulsanti Avanti e Ultimo quando viene visualizzata l'ultima pagina. L'oggetto PagedDataSource restituito dal metodo ObjectDataSource s Select() ha proprietà IsFirstPage e IsLastPage che è possibile esaminare per determinare se si sta visualizzando la prima o l'ultima pagina di dati.

Aggiungere quanto segue al gestore eventi objectDataSource:Selected

' Configure the paging interface based on the data in the PagedDataSource
FirstPage.Enabled = Not pagedData.IsFirstPage
PrevPage.Enabled = Not pagedData.IsFirstPage
NextPage.Enabled = Not pagedData.IsLastPage
LastPage.Enabled = Not pagedData.IsLastPage

Con questa aggiunta, i pulsanti First e Previous verranno disabilitati durante la visualizzazione della prima pagina, mentre i pulsanti Avanti e Ultimo verranno disabilitati durante la visualizzazione dell'ultima pagina.

È possibile completare l'interfaccia di paging informando l'utente della pagina che sta visualizzando e del numero totale di pagine esistenti. Aggiungere un controllo Web Etichetta alla pagina e impostarne la ID proprietà su CurrentPageNumber. Impostarne la Text proprietà nel gestore eventi Selected di ObjectDataSource in modo che includa la pagina corrente visualizzata () e il numero totale di pagine (PageIndex + 1PageCount).

' Display the current page being viewed...
CurrentPageNumber.Text = String.Format("You are viewing page {0} of {1}...", _
    PageIndex + 1, PageCount)

La figura 10 mostra Paging.aspx quando viene visitata per la prima volta. Poiché la stringa di query è vuota, per impostazione predefinita DataList vengono visualizzati i primi quattro prodotti; I pulsanti First e Previous sono disabilitati. Facendo clic su Avanti vengono visualizzati i quattro record successivi (vedere la figura 11); I pulsanti First e Previous sono ora abilitati.

Viene visualizzata la prima pagina dei dati

Figura 10: Viene visualizzata la prima pagina dei dati (fare clic per visualizzare l'immagine a dimensione intera)

Screenshot che mostra la pagina 2 dei dati di paging in una finestra DataList.

Figura 11: Viene visualizzata la seconda pagina di dati (fare clic per visualizzare l'immagine a dimensione intera)

Nota

L'interfaccia di paging può essere ulteriormente migliorata consentendo all'utente di specificare il numero di pagine da visualizzare per pagina. Ad esempio, è possibile aggiungere un oggetto DropDownList per elencare le opzioni relative alle dimensioni della pagina, ad esempio 5, 10, 25, 50 e Tutte. Quando si seleziona una dimensione di pagina, l'utente deve essere reindirizzato a Paging.aspx?pageIndex=0&pageSize=selectedPageSize. Lascio l'implementazione di questo miglioramento come esercizio per il lettore.

Uso del paging personalizzato

Le pagine DataList tramite i dati usano la tecnica di paging predefinita inefficiente. Quando si esegue il paging in quantità di dati sufficientemente grandi, è fondamentale usare il paging personalizzato. Anche se i dettagli di implementazione differiscono leggermente, i concetti alla base dell'implementazione del paging personalizzato in un oggetto DataList sono identici a quelli del paging predefinito. Con il paging personalizzato, usare il ProductBLL metodo della GetProductsPaged classe (anziché GetProductsAsPagedDataSource). Come illustrato nell'esercitazione Sul paging efficiente di grandi quantità di dati , GetProductsPaged è necessario passare l'indice di riga iniziale e il numero massimo di righe da restituire. Questi parametri possono essere mantenuti tramite la stringa di query esattamente come i pageIndex parametri e pageSize usati nel paging predefinito.

Poiché non è presente alcun PagedDataSource paging personalizzato, è necessario usare tecniche alternative per determinare il numero totale di record sottoposti a paging e se viene visualizzata la prima o l'ultima pagina di dati. Il TotalNumberOfProducts() metodo nella ProductsBLL classe restituisce il numero totale di prodotti sottoposti a paging. Per determinare se viene visualizzata la prima pagina di dati, esaminare l'indice di riga iniziale se è zero, quindi viene visualizzata la prima pagina. L'ultima pagina viene visualizzata se l'indice di riga iniziale più le righe massime da restituire è maggiore o uguale al numero totale di record di cui viene eseguito il paging.

L'implementazione del paging personalizzato verrà esaminata in modo più dettagliato nell'esercitazione successiva.

Riepilogo

Anche se i controlli DataList e Repeater non offrono il supporto di paging predefinito disponibile nei controlli GridView, DetailsView e FormView, tali funzionalità possono essere aggiunte con un impegno minimo. Il modo più semplice per implementare il paging predefinito consiste nell'eseguire il wrapping dell'intero set di prodotti all'interno di e PagedDataSource quindi associare a PagedDataSource DataList o Repeater. In questa esercitazione è stato aggiunto il GetProductsAsPagedDataSource metodo alla ProductsBLL classe per restituire .PagedDataSource La ProductsBLL classe contiene già i metodi necessari per il paging GetProductsPaged personalizzato e TotalNumberOfProducts.

Oltre a recuperare il set preciso di record da visualizzare per il paging personalizzato o tutti i record in un PagedDataSource per il paging predefinito, è necessario aggiungere manualmente l'interfaccia di paging. Per questa esercitazione è stata creata un'interfaccia Next, Previous, First, Last con quattro controlli Web Button. Inoltre, è stato aggiunto un controllo Etichetta che visualizza il numero di pagina corrente e il numero totale di pagine.

Nell'esercitazione successiva verrà illustrato come aggiungere il supporto per l'ordinamento a DataList e Repeater. Si vedrà anche come creare un oggetto DataList che può essere sia impaginato che ordinato (con esempi che usano il paging predefinito e personalizzato).

Buon programmatori!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, lavora con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, formatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2.0 in 24 ore. Può essere raggiunto all'indirizzo mitchell@4GuysFromRolla.com. o tramite il suo blog, disponibile all'indirizzo http://ScottOnWriting.NET.

Grazie speciale a

Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali per questa esercitazione sono stati Liz Shulok, Ken Pespisa e Bernadette Leigh. Interessati a esaminare i prossimi articoli MSDN? In tal caso, lasciami una riga in mitchell@4GuysFromRolla.com.