Stránkování dat sestavy ovládacími prvky DataList nebo Repeater (VB)

Scott Mitchell

Stáhnout PDF

I když datalist ani repeater nenabízí podporu automatického stránkování nebo řazení, tento kurz ukazuje, jak přidat podporu stránkování do DataListu nebo Repeateru, což umožňuje mnohem flexibilnější stránkování a zobrazení dat.

Úvod

Stránkování a řazení jsou dvě velmi běžné funkce při zobrazení dat v online aplikaci. Například při hledání ASP.NET knih v online knihkupectví mohou existovat stovky takových knih, ale sestava s výsledky hledání uvádí pouze deset shod na stránku. Kromě toho je možné výsledky seřadit podle názvu, ceny, počtu stránek, jména autora atd. Jak jsme probrali v kurzu Stránkování a řazení dat sestavy , ovládací prvky GridView, DetailsView a FormView poskytují integrovanou podporu stránkování, kterou je možné povolit zaškrtnutím políčka. GridView také zahrnuje podporu řazení.

DataList ani Repeater bohužel nenabízí podporu automatického stránkování nebo řazení. V tomto kurzu se podíváme, jak přidat podporu stránkování do datalistu nebo repeateru. Musíme ručně vytvořit stránkovací rozhraní, zobrazit příslušnou stránku záznamů a pamatovat si stránku, která je navštívena napříč postbacky. I když to trvá více času a kódu než u GridView, DetailsView nebo FormView, DataList a Repeater umožňují mnohem flexibilnější stránkování a zobrazení dat rozhraní.

Poznámka

Tento kurz se zaměřuje výhradně na stránkování. V dalším kurzu se budeme věnovat přidávání funkcí řazení.

Krok 1: Přidání webových stránek kurzu stránkování a řazení

Než začneme s tímto kurzem, pojďme nejdřív chvíli přidat ASP.NET stránky, které budeme potřebovat pro tento kurz a další. Začněte vytvořením nové složky v projektu s názvem PagingSortingDataListRepeater. Dále do této složky přidejte následujících pět ASP.NET stránek, které mají všechny nakonfigurované tak, aby používaly stránku Site.masterpředlohy:

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

Vytvořte složku PagingSortingDataListRepeater a přidejte kurz ASP.NET pages.

Obrázek 1: Vytvoření PagingSortingDataListRepeater složky a přidání ASP.NET stránek kurzu

Pak otevřete Default.aspx stránku a přetáhněte SectionLevelTutorialListing.ascx uživatelský ovládací prvek ze UserControls složky na návrhovou plochu. Tento uživatelský ovládací prvek, který jsme vytvořili v kurzu Stránky předlohy a Navigace na webu , vytvoří výčet mapy webu a zobrazí tyto kurzy v aktuálním oddílu v seznamu s odrážkami.

Přidání uživatelského ovládacího prvku SectionLevelTutorialListing.ascx do Default.aspx

Obrázek 2: Přidání SectionLevelTutorialListing.ascx uživatelského ovládacího prvku do Default.aspx (kliknutím zobrazíte obrázek v plné velikosti)

Aby seznam s odrážkami zobrazoval kurzy stránkování a řazení, které budeme vytvářet, musíme je přidat do mapy webu. Web.sitemap Otevřete soubor a za značku uzlu Upravit a odstranit pomocí mapování webu DataList přidejte následující kód:

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

Aktualizace mapy webu tak, aby zahrnovala nové stránky ASP.NET

Obrázek 3: Aktualizace mapy webu tak, aby zahrnovala nové stránky ASP.NET

Kontrola stránkování

V předchozích kurzech jsme viděli, jak procházet data v ovládacích prvcích GridView, DetailsView a FormView. Tyto tři ovládací prvky nabízejí jednoduchou formu stránkování označovanou jako výchozí stránkování , kterou lze implementovat jednoduše zaškrtnutím možnosti Povolit stránkování v inteligentní značce ovládacích prvků. Při výchozím stránkování je pokaždé, když je požadována stránka dat buď na první stránce, nebo když uživatel přejde na jinou stránku dat, ovládací prvek GridView, DetailsView nebo FormView znovu požádá o všechna data z ObjectDataSource. Poté vystřihl konkrétní sadu záznamů, které se mají zobrazit vzhledem k požadovanému indexu stránky, a počet záznamů, které se mají zobrazit na stránce. O výchozím stránkování jsme se podrobně bavili v kurzu Stránkování a řazení dat sestavy .

Vzhledem k tomu, že výchozí stránkování znovu vyžaduje všechny záznamy pro každou stránku, není to praktické při stránkování dostatečně velkých objemů dat. Představte si například stránkování přes 50 000 záznamů s velikostí stránky 10. Pokaždé, když se uživatel přesune na novou stránku, musí se z databáze načíst všech 50 000 záznamů, i když se jich zobrazí jenom deset.

Vlastní stránkování řeší problémy s výkonem výchozího stránkování tím, že na požadované stránce vezme jenom přesnou podmnožinu záznamů. Při implementaci vlastního stránkování musíme napsat dotaz SQL, který efektivně vrátí jenom správnou sadu záznamů. V kurzu Efektivní stránkování velkých objemů dat jsme viděli, jak takový dotaz vytvořit pomocí nového ROW_NUMBER() klíčového slova SQL Server 2005.

Chcete-li implementovat výchozí stránkování v ovládacích prvcích DataList nebo Repeater, můžeme použítPagedDataSource třídu jako obálku ProductsDataTable kolem obsahu, jehož obsah je stránkován. Třída PagedDataSourceDataSource vlastnost, kterou lze přiřadit k libovolnému objektu a PageSize vlastnostem a CurrentPageIndex vlastnostem, které označují, kolik záznamů se má zobrazit na stránce a aktuální index stránky. Jakmile jsou tyto vlastnosti nastaveny, PagedDataSource lze použít jako zdroj dat libovolného datového webového ovládacího prvku. Při PagedDataSourcevýčtu vrátí pouze odpovídající podmnožinu záznamů svého vnitřního DataSource objektu na PageSize základě vlastností a CurrentPageIndex . Obrázek 4 znázorňuje funkčnost PagedDataSource třídy.

PagedDataSource zabalí objekt s možností vytvoření výčtu s stránkovatelným rozhraním.

Obrázek 4: Zalomí PagedDataSource výčtový objekt s stránkovatelným rozhraním.

Objekt PagedDataSource může být vytvořen a nakonfigurován přímo z vrstvy obchodní logiky a svázán s DataList nebo Repeater prostřednictvím ObjectDataSource, nebo může být vytvořen a nakonfigurován přímo v ASP.NET stránky s kód-na pozadí třídy. Pokud je použit druhý přístup, musíme opustit použití ObjectDataSource a místo toho vytvořit vazbu stránkovaných dat na DataList nebo Repeater programově.

Objekt PagedDataSource má také vlastnosti pro podporu vlastního stránkování. Použití vlastního PagedDataSource stránkování ale můžeme obejít, protože ve třídě již máme metody ProductsBLL BLL určené pro vlastní stránkování, které vrací přesné záznamy, které se mají zobrazit.

V tomto kurzu se podíváme na implementaci výchozího stránkování v Seznamu dat přidáním nové metody do ProductsBLL třídy, která vrací správně nakonfigurovaný PagedDataSource objekt. V dalším kurzu se dozvíte, jak používat vlastní stránkování.

Krok 2: Přidání výchozí metody stránkování ve vrstvě obchodní logiky

Třída ProductsBLL má v současné době metodu pro vrácení všech informací o GetProducts() produktu a metodu pro vrácení konkrétní podmnožiny produktů na počátečním indexu GetProductsPaged(startRowIndex, maximumRows). Při výchozím stránkování ovládací prvky GridView, DetailsView a FormView používají metodu GetProducts() k načtení všech produktů, ale pak interně použít PagedDataSource k zobrazení pouze správné podmnožiny záznamů. Abychom mohli replikovat tuto funkci pomocí ovládacích prvků DataList a Repeater, můžeme v BLL vytvořit novou metodu, která toto chování napodobuje.

Do třídy přidejte metodu ProductsBLL s názvem GetProductsAsPagedDataSource , která přijímá dva celočíselné vstupní parametry:

  • pageIndex index stránky, která se má zobrazit, indexovaná na nule a
  • pageSize počet záznamů, které se mají zobrazit na stránce.

GetProductsAsPagedDataSource Začne načtením všech záznamů z GetProducts(). Potom vytvoří PagedDataSource objekt a nastaví jeho CurrentPageIndex vlastnosti PageSize na hodnoty předaných pageIndex parametrů a pageSize . Metoda končí tím, že vrátí toto nakonfigurované 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

Krok 3: Zobrazení informací o produktu v seznamu DataList pomocí výchozího stránkování

S metodou GetProductsAsPagedDataSource přidanou ProductsBLL do třídy teď můžeme vytvořit DataList nebo Repeater, který poskytuje výchozí stránkování. Začněte tím, že Paging.aspx otevřete stránku ve PagingSortingDataListRepeater složce a přetáhnete DataList z panelu nástrojů do Designer a nastavíte vlastnost ProductsDefaultPagingDataList na ID . Z inteligentní značky DataList s vytvořte nový ObjectDataSource s názvem ProductsDefaultPagingDataSource a nakonfigurujte ho GetProductsAsPagedDataSource tak, aby načítal data pomocí metody .

Vytvořte ObjectDataSource a nakonfigurujte ho tak, aby používal metodu GetProductsAsPagedDataSource ().

Obrázek 5: Vytvoření objektu ObjectDataSource a jeho konfigurace pro použití GetProductsAsPagedDataSource() metody (kliknutím zobrazíte obrázek v plné velikosti)

Nastavte rozevírací seznamy na kartách UPDATE, INSERT a DELETE na (Žádné) .

Nastavte Drop-Down Seznamy na kartách UPDATE, INSERT a DELETE na (Žádné).

Obrázek 6: Nastavení Drop-Down Seznamy na kartách UPDATE, INSERT a DELETE na (Žádné) (Kliknutím zobrazíte obrázek v plné velikosti)

Vzhledem k tomu, že GetProductsAsPagedDataSource metoda očekává dva vstupní parametry, průvodce nás vyzve k zadání zdroje těchto hodnot parametrů.

Hodnoty indexu stránky a velikosti stránky se musí pamatovat napříč zpětnými operacemi. Je možné je uložit ve stavu zobrazení, uložit do řetězce dotazu, uložit do proměnných relace nebo si je zapamatovat pomocí jiné techniky. Pro účely tohoto kurzu použijeme řetězec dotazů, který má tu výhodu, že umožňuje záložku konkrétní stránky dat.

Pro parametry a pageSize použijte konkrétně pole řetězce dotazu pageIndex a pageSize pageIndex (viz obrázek 7). Chvíli nastavte výchozí hodnoty pro tyto parametry, protože hodnoty řetězce dotazů nebudou k dispozici, když uživatel poprvé navštíví tuto stránku. V případě pageIndexnastavte výchozí hodnotu na 0 (která zobrazí první stránku dat) a pageSize výchozí hodnotu na 4.

Jako zdroj stránky Použijte QueryString a pageSize Parameters.

Obrázek 7: Použití řetězce dotazu jako zdroje pageIndex parametrů a pageSize (kliknutím zobrazíte obrázek v plné velikosti)

Po konfiguraci ObjectDataSource visual Studio automaticky vytvoří ItemTemplate objekt pro DataList. Upravte ho ItemTemplate tak, aby se zobrazoval jenom název produktu, kategorie a dodavatel. Nastavte také vlastnost DataList s RepeatColumns na hodnotu 2, její Width hodnotu na 100 % a hodnotu ItemStyle s Width na 50 %. Tato nastavení šířky zajistí stejné mezery pro oba sloupce.

Po provedení těchto změn by značky DataList a ObjectDataSource měly vypadat přibližně takto:

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

Poznámka

Vzhledem k tomu, že v tomto kurzu neprovádíme žádné funkce aktualizace ani odstraňování, můžete stav zobrazení DataList zakázat, abyste zmenšili velikost vykreslené stránky.

Při počáteční návštěvě této stránky v prohlížeči nejsou k dispozici ani pageIndex parametry řetězce dotazu ani pageSize . Proto se použijí výchozí hodnoty 0 a 4. Jak ukazuje obrázek 8, výsledkem je Seznam dat, který zobrazuje první čtyři produkty.

První čtyři produkty jsou uvedeny

Obrázek 8: První čtyři produkty jsou uvedené (kliknutím zobrazíte obrázek v plné velikosti)

Bez stránkovacího rozhraní v současné době neexistuje jednoduchý způsob, jak uživatel přejít na druhou stránku dat. Stránkovací rozhraní vytvoříme v kroku 4. Prozatím je ale stránkování možné provést pouze tak, že v řetězci dotazu zadáte přímo kritéria stránkování. Pokud například chcete zobrazit druhou stránku, změňte adresu URL v adresní řádku prohlížeče z Paging.aspx na Paging.aspx?pageIndex=2 a stiskněte Enter. To způsobí, že se zobrazí druhá stránka dat (viz Obrázek 9).

Snímek obrazovky stránkování dat v okně DataList zobrazující druhou stránku dat

Obrázek 9: Zobrazí se druhá stránka dat (kliknutím zobrazíte obrázek v plné velikosti)

Krok 4: Vytvoření stránkovacího rozhraní

Existuje celá řada různých stránkovacích rozhraní, která je možné implementovat. Ovládací prvky GridView, DetailsView a FormView poskytují čtyři různá rozhraní, ze které si můžete vybrat:

  • V dalším kroku můžou předchozí uživatelé přesouvat jednu stránku na další nebo předchozí stránku.
  • Next, Previous, First, Last navíc k tlačítkům Další a Předchozí, toto rozhraní obsahuje první a poslední tlačítka pro přechod na úplně první nebo úplně poslední stránku.
  • Číselný seznam čísel stránek ve stránkovacím rozhraní umožňuje uživateli rychle přejít na určitou stránku.
  • Číselný, první, poslední kromě čísel stránek obsahuje tlačítka pro přechod na úplně první nebo úplně poslední stránku.

U datových seznamů DataList a Repeater zodpovídáme za rozhodnutí o stránkovacím rozhraní a jeho implementaci. To zahrnuje vytvoření potřebných webových ovládacích prvků na stránce a zobrazení požadované stránky při kliknutí na tlačítko konkrétního stránkovacího rozhraní. Kromě toho může být nutné zakázat některé ovládací prvky stránkovacího rozhraní. Například při prohlížení první stránky dat pomocí rozhraní Další, Předchozí, První, Poslední by byla zakázána tlačítka První i Předchozí.

Pro účely tohoto kurzu použijeme rozhraní Next, Previous, First, Last. Přidejte na stránku čtyři webové ovládací prvky Button (Tlačítko) a nastavte jejich ID hodnoty na FirstPage, PrevPage, NextPagea LastPage. Nastavte vlastnosti na Text<< První, < Předchozí, Další >a Poslední >> .

<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 >>" />

Dále vytvořte obslužnou rutinu Click události pro každé z těchto tlačítek. Za chvíli přidáme kód potřebný k zobrazení požadované stránky.

Zapamatování celkového počtu stránkovaných záznamů

Bez ohledu na vybrané rozhraní stránkování musíme vypočítat a zapamatovat si celkový počet stránkovaných záznamů. Celkový počet řádků (ve spojení s velikostí stránky) určuje celkový počet stránek dat, které jsou stránkovány, což určuje, které ovládací prvky stránkovacího rozhraní jsou přidány nebo jsou povoleny. V rozhraní Další, Předchozí, První, Poslední, které vytváříme, se počet stránek používá dvěma způsoby:

  • Pokud chcete zjistit, jestli si prohlížíme poslední stránku, jsou tlačítka Další a Poslední zakázaná.
  • Pokud uživatel klikne na tlačítko Poslední, musíme ho přesunout na poslední stránku, jejíž index je o jednu méně než počet stránek.

Počet stránek se počítá jako horní mez celkového počtu řádků dělený velikostí stránky. Pokud například stránkujeme 79 záznamů se čtyřmi záznamy na stránku, počet stránek je 20 (horní mez 79 / 4). Pokud používáme číselné stránkovací rozhraní, tyto informace nás informují o tom, kolik číselných stránek tlačítek k zobrazení; Pokud naše stránkovací rozhraní obsahuje tlačítka Další nebo Poslední, použije se počet stránek k určení, kdy zakázat tlačítka Další nebo Poslední.

Pokud stránkovací rozhraní obsahuje tlačítko Last, je nutné, aby se celkový počet stránkovaných záznamů zapamatoval napříč zpětnými operacemi, abychom po kliknutí na tlačítko Poslední mohli určit index poslední stránky. Pro usnadnění vytvořte TotalRowCount vlastnost ve třídě kódu ASP.NET stránky, která uchovává svou hodnotu pro zobrazení stavu:

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

Kromě nástroje TotalRowCountchvíli trvá vytváření vlastností na úrovni stránky jen pro čtení pro snadný přístup k indexu stránky, velikosti stránky a počtu stránek:

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

Určení celkového počtu záznamů procházejících stránkováním

Objekt PagedDataSource vrácený metodou ObjectDataSource s Select() obsahuje všechny záznamy produktu, i když se v DataList zobrazí pouze jejich podmnožina. Vlastnost PagedDataSource s Count vrátí pouze počet položek, které se zobrazí v objektu DataList; DataSourceCount vlastnost vrátí celkový počet položek v rámci objektu PagedDataSource. Proto musíme vlastnosti ASP.NET page s TotalRowCount přiřadit hodnotu PagedDataSource vlastnosti s DataSourceCount .

Chcete-li toho dosáhnout, vytvořte obslužnou rutinu události objectDataSource události.Selected V obslužné rutině Selected události máme přístup k návratové hodnotě metody ObjectDataSource s Select() , v tomto případě 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

Zobrazení požadované stránky dat

Když uživatel klikne na jedno z tlačítek ve stránkovacím rozhraní, musíme zobrazit požadovanou stránku dat. Vzhledem k tomu, že parametry stránkování se zadává prostřednictvím řetězce dotazu, použijte Response.Redirect(url) k zobrazení požadované stránky dat příkaz , aby prohlížeč uživatele znovu požádal o Paging.aspx stránku s příslušnými parametry stránkování. Pokud bychom například chtěli zobrazit druhou stránku dat, přesměrovali bychom uživatele na Paging.aspx?pageIndex=1adresu .

Pokud to chcete usnadnit, vytvořte metodu RedirectUser(sendUserToPageIndex) , která přesměruje uživatele na Paging.aspx?pageIndex=sendUserToPageIndex. Pak zavolejte tuto metodu ze čtyř obslužných rutin událostí Button Click . V obslužné rutině FirstPageClick události zavolejte RedirectUser(0), aby se odeslaly na první stránku, v PrevPageClick obslužné rutině události použijte PageIndex - 1 jako index stránky atd.

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

Click Po dokončení obslužných rutin událostí lze záznamy DataList s procházet kliknutím na tlačítka. Udělejte si chvilku a vyzkoušejte to!

Zakázání ovládacích prvků stránkovacího rozhraní

V současné době jsou povolená všechna čtyři tlačítka bez ohledu na zobrazenou stránku. Chceme ale zakázat tlačítka První a Předchozí při zobrazení první stránky dat a tlačítka Další a Poslední při zobrazení poslední stránky. Objekt PagedDataSource vrácený metodou ObjectDataSource s Select() má vlastnosti IsFirstPage a IsLastPage které můžeme prozkoumat, abychom zjistili, jestli se zobrazuje první nebo poslední stránka dat.

Do obslužné rutiny události ObjectDataSource Selected přidejte následující:

' 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

Po tomto přidání budou tlačítka První a Předchozí při prohlížení první stránky zakázaná, zatímco tlačítka Další a Poslední budou při prohlížení poslední stránky zakázaná.

Dokončíme stránkovací rozhraní tím, že uživatele informujete, jakou stránku si právě prohlíží a kolik stránek celkem existuje. Přidejte na stránku ovládací prvek Label Web a nastavte jeho ID vlastnost na CurrentPageNumber. Nastavte jeho Text vlastnost v obslužné rutině události ObjectDataSource s Selected tak, aby zahrnovala aktuální zobrazenou stránku (PageIndex + 1) a celkový počet stránek (PageCount).

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

Obrázek 10 ukazuje Paging.aspx při první návštěvě. Vzhledem k tomu, že řetězec dotazu je prázdný, DataList ve výchozím nastavení zobrazuje první čtyři produkty; Tlačítka První a Předchozí jsou zakázaná. Kliknutím na Další zobrazíte další čtyři záznamy (viz obrázek 11). Tlačítka První a Předchozí jsou teď povolená.

Zobrazí se první stránka dat.

Obrázek 10: Zobrazí se první stránka dat (kliknutím zobrazíte obrázek v plné velikosti)

Snímek obrazovky zobrazující stránku 2 stránkování dat v okně DataList

Obrázek 11: Zobrazí se druhá stránka dat (kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Stránkovací rozhraní lze dále vylepšit tím, že uživateli umožníte určit, kolik stránek se má zobrazit na stránce. Můžete například přidat rozevírací seznam s možnostmi velikosti stránky, například 5, 10, 25, 50 a vše. Po výběru velikosti stránky bude potřeba uživatele přesměrovat zpět na Paging.aspx?pageIndex=0&pageSize=selectedPageSizeadresu . Implementaci tohoto vylepšení nechávám jako cvičení pro čtenáře.

Použití vlastního stránkování

DataList prochází svá data pomocí neefektivní výchozí techniky stránkování. Při stránkování dostatečně velkých objemů dat je nutné použít vlastní stránkování. Přestože se podrobnosti implementace mírně liší, koncepty implementace vlastního stránkování v objektu DataList jsou stejné jako u výchozího stránkování. U vlastního stránkování použijte metodu ProductBLL třídy s GetProductsPaged (místo GetProductsAsPagedDataSource). Jak je popsáno v kurzu Efektivní stránkování velkých objemů dat , GetProductsPaged musí být předán index počátečního řádku a maximální počet řádků, které se mají vrátit. Tyto parametry je možné udržovat prostřednictvím řetězce dotazu stejně jako pageIndex parametry a pageSize použité ve výchozím stránkování.

Vzhledem k tomu, že vlastní stránkování neexistuje PagedDataSource , je nutné použít alternativní techniky k určení celkového počtu záznamů, které jsou stránkovány, a toho, jestli zobrazujeme první nebo poslední stránku dat. Metoda TotalNumberOfProducts() ve ProductsBLL třídě vrátí celkový počet produktů, které jsou stránkovány. Pokud chcete zjistit, jestli se zobrazuje první stránka dat, zkontrolujte index počátečního řádku, pokud je nulový, a pak se zobrazuje první stránka. Poslední stránka se zobrazí, pokud je index počátečního řádku plus maximální počet řádků, které se mají vrátit, větší nebo roven celkovému počtu stránkovaných záznamů.

Implementaci vlastního stránkování podrobněji prozkoumáme v dalším kurzu.

Souhrn

I když DataList ani Repeater nenabízí podporu stránkování, které se nachází v ovládacích prvcích GridView, DetailsView a FormView, takové funkce lze přidat s minimálním úsilím. Nejjednodušším způsobem, jak implementovat výchozí stránkování, je zabalit celou sadu produktů do objektu PagedDataSource a pak svázat PagedDataSource s objektem DataList nebo Repeater. V tomto kurzu jsme do třídy přidali metodu GetProductsAsPagedDataSourceProductsBLL , která vrací PagedDataSource. Třída ProductsBLL již obsahuje metody potřebné pro vlastní stránkování GetProductsPaged a TotalNumberOfProducts.

Spolu s načtením buď přesné sady záznamů, které se mají zobrazit pro vlastní stránkování, nebo všech záznamů v PagedDataSource souboru pro výchozí stránkování, musíme také ručně přidat stránkovací rozhraní. Pro účely tohoto kurzu jsme vytvořili rozhraní Next, Previous, First, Last se čtyřmi webovými ovládacími prvky Button. Byl přidán také ovládací prvek Popisek zobrazující číslo aktuální stránky a celkový počet stránek.

V dalším kurzu se dozvíte, jak přidat podporu řazení do datových seznamů a repeaterů. Uvidíme také, jak vytvořit dataList, který se dá stránkovat i řadit (s příklady s použitím výchozího a vlastního stránkování).

Všechno nejlepší na programování!

O autorovi

Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byli Liz Shulok, Ken Pespisa a Bernadette Leigh. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.