Share via


Auslagern von Berichtsdaten in einem DataList- oder Wiederholungssteuerelement (VB)

von Scott Mitchell

PDF herunterladen

Obwohl weder dataList noch Repeater automatische Paging- oder Sortierunterstützung bieten, zeigt dieses Tutorial, wie Sie der DataList oder dem Repeater Pagingunterstützung hinzufügen, was viel flexiblere Paging- und Datenanzeigeschnittstellen ermöglicht.

Einführung

Paging und Sortierung sind zwei sehr häufige Features beim Anzeigen von Daten in einer Onlineanwendung. Bei der Suche nach ASP.NET Büchern in einem Online-Buchhandel kann es hunderte solcher Bücher geben, aber der Bericht mit den Suchergebnissen listet nur zehn Übereinstimmungen pro Seite auf. Darüber hinaus können die Ergebnisse nach Titel, Preis, Seitenanzahl, Autorenname usw. sortiert werden. Wie im Tutorial Paging and Sorting Report Data erläutert, bieten die Steuerelemente GridView, DetailsView und FormView integrierte Pagingunterstützung, die mit einem Kontrollkästchen aktiviert werden kann. Die GridView umfasst auch Sortierunterstützung.

Leider bieten weder dataList noch Repeater unterstützung für automatisches Paging oder Sortierung. In diesem Tutorial erfahren Sie, wie Sie der DataList oder dem Repeater Pagingunterstützung hinzufügen. Wir müssen die Pagingschnittstelle manuell erstellen, die entsprechende Seite mit Datensätzen anzeigen und die Seite, die postbacksübergreifend besucht wird, merken. Dies nimmt zwar mehr Zeit und Code in Anspruch als bei GridView, DetailsView oder FormView, aber dataList und Repeater ermöglichen viel flexiblere Paging- und Datenanzeigeschnittstellen.

Hinweis

Dieses Tutorial konzentriert sich ausschließlich auf das Paging. Im nächsten Tutorial widmen wir uns dem Hinzufügen von Sortierfunktionen.

Schritt 1: Hinzufügen der Tutorialwebseiten zum Paging und Sortieren

Bevor wir mit diesem Tutorial beginnen, nehmen wir uns zunächst einen Moment Zeit, um die ASP.NET Seiten hinzuzufügen, die wir für dieses Tutorial und das nächste Tutorial benötigen. Erstellen Sie zunächst einen neuen Ordner im Projekt mit dem Namen PagingSortingDataListRepeater. Fügen Sie als Nächstes die folgenden fünf ASP.NET Seiten zu diesem Ordner hinzu, wobei alle für die Verwendung der master Seite Site.masterkonfiguriert sind:

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

Erstellen eines PagingSortingDataListRepeater-Ordners und Hinzufügen des Tutorials ASP.NET Seiten

Abbildung 1: Erstellen eines PagingSortingDataListRepeater Ordners und Hinzufügen des Tutorials ASP.NET Seiten

Öffnen Sie als Nächstes die Default.aspx Seite, und ziehen Sie das SectionLevelTutorialListing.ascx Benutzersteuerelement aus dem UserControls Ordner auf die Entwurfsoberfläche. Dieses Benutzersteuerelement, das wir im Tutorial Gestaltungsvorlagen und Websitenavigation erstellt haben, listet die Websiteübersicht auf und zeigt diese Tutorials im aktuellen Abschnitt in einer Aufzählung an.

Hinzufügen des SectionLevelTutorialListing.ascx-Benutzersteuerelements zu Default.aspx

Abbildung 2: Hinzufügen des SectionLevelTutorialListing.ascx Benutzersteuerelements zu Default.aspx (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Damit die Aufzählungsliste die Tutorials zum Paging und Sortieren anzeigt, die wir erstellen, müssen sie der Websiteübersicht hinzugefügt werden. Öffnen Sie die Web.sitemap Datei, und fügen Sie das folgende Markup nach dem Markup Bearbeiten und Löschen mit dem DataList-Siteübersichtsknoten hinzu:

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

Aktualisieren der Websiteübersicht, um die neuen ASP.NET-Seiten einzuschließen

Abbildung 3: Aktualisieren der Websiteübersicht, um die neue ASP.NET-Seiten einzuschließen

Eine Überprüfung des Pagings

In den vorherigen Tutorials wurde gezeigt, wie Sie die Daten in den Steuerelementen GridView, DetailsView und FormView durchblättern. Diese drei Steuerelemente bieten eine einfache Form des Pagings als Standardpaging , die implementiert werden kann, indem einfach die Option Paging aktivieren im Smarttag des Steuerelements aktiviert wird. Beim Standardpapageing fordert das GridView-, DetailsView- oder FormView-Steuerelement jedes Mal, wenn eine Datenseite beim ersten Seitenbesuch oder beim Navigieren des Benutzers zu einer anderen Datenseite angefordert wird, alle Daten aus der ObjectDataSource neu an. Anschließend wird der bestimmte Satz von Datensätzen, die angezeigt werden sollen, unter Berücksichtigung des angeforderten Seitenindexes und der Anzahl der Datensätze, die pro Seite angezeigt werden sollen, herausgeblendet. Im Tutorial zum Paging und Sortieren von Berichtsdaten wurde die Standardpaererstellung ausführlich erläutert.

Da das Standardpapageing alle Datensätze für jede Seite erneut anfordert, ist dies beim Durchlaufen ausreichend großer Datenmengen nicht praktikabel. Stellen Sie sich beispielsweise vor, sie durchlaufen 50.000 Datensätze mit einer Seitengröße von 10. Jedes Mal, wenn der Benutzer zu einer neuen Seite wechselt, müssen alle 50.000 Datensätze aus der Datenbank abgerufen werden, obwohl nur zehn davon angezeigt werden.

Benutzerdefinierte Paging löst die Leistungsprobleme des Standardpapageings, indem nur die genaue Teilmenge der Datensätze abgerufen wird, die auf der angeforderten Seite angezeigt werden sollen. Beim Implementieren des benutzerdefinierten Pagings müssen wir die SQL-Abfrage schreiben, die effizient nur den richtigen Satz von Datensätzen zurückgibt. Wie Sie eine solche Abfrage mit SQL Server 2005 s neuen ROW_NUMBER() Schlüsselwort (keyword) erstellen, haben Wir im Tutorial Effizientes Paging durch große Datenmengen erfahren.

Um das Standardpapageing in den DataList- oder Repeater-Steuerelementen zu implementieren, können wir die PagedDataSource -Klasse als Wrapper um die ProductsDataTable Klasse verwenden, deren Inhalt ausgelagert wird. Die PagedDataSource -Klasse verfügt über eine DataSource Eigenschaft, die jedem aufzählbaren Objekt zugewiesen werden kann, und PageSize eigenschaften CurrentPageIndex , die angeben, wie viele Datensätze pro Seite und der aktuelle Seitenindex angezeigt werden sollen. Nachdem diese Eigenschaften festgelegt wurden, kann die PagedDataSource als Datenquelle eines beliebigen Datenwebsteuerelements verwendet werden. Der PagedDataSourcegibt bei Aufzählung nur die entsprechende Teilmenge der Datensätze seines Inneren DataSource basierend auf den PageSize Eigenschaften und CurrentPageIndex zurück. Abbildung 4 zeigt die Funktionalität der PagedDataSource -Klasse.

PagedDataSource umschließt ein aufzählbares Objekt mit einer pageable-Schnittstelle

Abbildung 4: Umschließt PagedDataSource ein aufzählbares Objekt mit einer pageable-Schnittstelle

Das PagedDataSource Objekt kann direkt aus der Geschäftslogikebene erstellt und konfiguriert und über eine ObjectDataSource an eine DataList oder einen Repeater gebunden oder direkt in der CodeBehind-Klasse der ASP.NET Seite erstellt und konfiguriert werden. Wenn der letztere Ansatz verwendet wird, müssen wir auf die Verwendung von ObjectDataSource verzichten und stattdessen die ausgelagerten Daten programmgesteuert an die DataList oder den Repeater binden.

Das PagedDataSource Objekt verfügt auch über Eigenschaften, die benutzerdefiniertes Paging unterstützen. Wir können jedoch die Verwendung eines PagedDataSource für benutzerdefiniertes Paging umgehen, da wir bereits über BLL-Methoden in der Klasse verfügen, die für benutzerdefiniertes ProductsBLL Paging entwickelt wurden und die genauen Datensätze zurückgeben, die angezeigt werden sollen.

In diesem Tutorial untersuchen wir die Implementierung der Standard paging in einer DataList durch Hinzufügen einer neuen Methode zur Klasse, die ProductsBLL ein entsprechend konfiguriertes PagedDataSource Objekt zurückgibt. Im nächsten Tutorial erfahren Sie, wie Sie benutzerdefiniertes Paging verwenden.

Schritt 2: Hinzufügen einer Standard paging-Methode in der Geschäftslogikebene

Die ProductsBLL -Klasse verfügt derzeit über eine Methode zum Zurückgeben aller Produktinformationen GetProducts() und eine zum Zurückgeben einer bestimmten Teilmenge von Produkten an einem Startindex GetProductsPaged(startRowIndex, maximumRows). Beim Standardmäßigen Paging verwenden die Steuerelemente GridView, DetailsView und FormView alle die GetProducts() -Methode, um alle Produkte abzurufen. Verwenden Sie dann intern ein PagedDataSource , um nur die richtige Teilmenge der Datensätze anzuzeigen. Um diese Funktionalität mit den DataList- und Repeater-Steuerelementen zu replizieren, können wir eine neue Methode in der BLL erstellen, die dieses Verhalten nachahmt.

Fügen Sie der Klasse eine Methode mit dem ProductsBLL Namen GetProductsAsPagedDataSource hinzu, die zwei ganzzahlige Eingabeparameter akzeptiert:

  • pageIndex der Index der anzuzeigenden Seite, die bei null indiziert ist, und
  • pageSize die Anzahl der Datensätze, die pro Seite angezeigt werden sollen.

GetProductsAsPagedDataSource wird gestartet, indem alle Datensätze aus abgerufen werden GetProducts(). Anschließend erstellt es ein PagedDataSource -Objekt und legt seine CurrentPageIndex Eigenschaften und PageSize auf die Werte der übergebenen pageIndex Parameter und pageSize fest. Die -Methode schließt mit der Rückgabe des konfigurierten 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

Schritt 3: Anzeigen von Produktinformationen in einer DataList mithilfe von Standardpa paging

Mit der -Methode, die GetProductsAsPagedDataSource der ProductsBLL -Klasse hinzugefügt wurde, können wir jetzt eine DataList- oder Repeater-Instanz erstellen, die standard paging bietet. Öffnen Sie zunächst die Paging.aspx Seite im PagingSortingDataListRepeater Ordner, und ziehen Sie eine DataList aus der Toolbox auf die Designer, und legen Sie die DataList-Eigenschaft ID auf festProductsDefaultPaging. Erstellen Sie aus dem Smarttag des DataList-Smarttags eine neue ObjectDataSource mit dem Namen, ProductsDefaultPagingDataSource und konfigurieren Sie es so, dass Daten mithilfe der GetProductsAsPagedDataSource -Methode abgerufen werden.

Erstellen sie eine ObjectDataSource, und konfigurieren Sie sie für die Verwendung der GetProductsAsPagedDataSource ()-Methode

Abbildung 5: Erstellen einer ObjectDataSource und Konfigurieren der GetProductsAsPagedDataSource() Methode (Klicken Sie hier, um ein vollständiges Bild anzuzeigen)

Legen Sie die Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.

Legen Sie die Drop-Down Listen auf den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.

Abbildung 6: Legen Sie die Drop-Down Listen in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest (Klicken Sie, um das bild in voller Größe anzuzeigen)

Da die GetProductsAsPagedDataSource Methode zwei Eingabeparameter erwartet, fordert uns der Assistent zur Angabe der Quelle dieser Parameterwerte auf.

Die Werte für Seitenindex und Seitengröße müssen postbacksübergreifend gespeichert werden. Sie können im Ansichtszustand gespeichert, in der Abfragezeichenfolge beibehalten, in Sitzungsvariablen gespeichert oder mit einer anderen Technik gespeichert werden. In diesem Tutorial verwenden wir die Abfragezeichenfolge, die den Vorteil hat, dass eine bestimmte Datenseite mit Lesezeichen versehen werden kann.

Verwenden Sie insbesondere die Abfragezeichenfolgenfelder pageIndex bzw. pageSize für die pageIndex Parameter und pageSize (siehe Abbildung 7). Nehmen Sie sich einen Moment Zeit, um die Standardwerte für diese Parameter festzulegen, da die Abfragezeichenfolgenwerte nicht vorhanden sind, wenn ein Benutzer diese Seite zum ersten Mal besucht. pageIndexLegen Sie für den Standardwert auf 0 (die erste Datenseite) und pageSize den Standardwert auf 4 fest.

Verwenden Der QueryString als Quelle für die Parameter pageIndex und pageSize

Abbildung 7: Verwenden Sie den QueryString als Quelle für die pageIndex Parameter und pageSize (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Nach dem Konfigurieren der ObjectDataSource erstellt Visual Studio automatisch eine ItemTemplate für die DataList. Passen Sie die ItemTemplate so an, dass nur der Name, die Kategorie und der Lieferant des Produkts angezeigt werden. Legen Sie außerdem die DataList-Eigenschaft RepeatColumns auf 2, ihre Width auf 100 % und ihre ItemStyle s Width auf 50 % fest. Diese Breiteneinstellungen bieten den gleichen Abstand für die beiden Spalten.

Nachdem Sie diese Änderungen vorgenommen haben, sollte das DataList- und ObjectDataSource-Markup wie folgt aussehen:

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

Hinweis

Da wir in diesem Tutorial keine Aktualisierungs- oder Löschfunktionen ausführen, können Sie den Ansichtsstatus der DataList deaktivieren, um die gerenderte Seitengröße zu reduzieren.

Beim ersten Besuch dieser Seite über einen Browser werden weder die pageIndex Abfragezeichenfolgenparameter noch pageSize angegeben. Daher werden die Standardwerte 0 und 4 verwendet. Wie Abbildung 8 zeigt, ergibt sich daraus eine DataList, die die ersten vier Produkte anzeigt.

Die ersten vier Produkte sind aufgeführt

Abbildung 8: Die ersten vier Produkte sind aufgelistet (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Ohne eine Pagingschnittstelle gibt es für einen Benutzer derzeit keine einfache Möglichkeit, zur zweiten Datenseite zu navigieren. In Schritt 4 erstellen wir eine Pagingschnittstelle. Derzeit kann das Paging jedoch nur durch die direkte Angabe der Pagingkriterien in der Abfragezeichenfolge erreicht werden. Wenn Sie beispielsweise die zweite Seite anzeigen möchten, ändern Sie die URL in der Adressleiste des Browsers von in Paging.aspx , Paging.aspx?pageIndex=2 und drücken Sie die EINGABETASTE. Dadurch wird die zweite Datenseite angezeigt (siehe Abbildung 9).

Screenshot: Auslagerungsdaten in einem DataList-Fenster mit der zweiten Datenseite

Abbildung 9: Die zweite Seite der Daten wird angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 4: Erstellen der Pagingschnittstelle

Es gibt eine Vielzahl unterschiedlicher Pagingschnittstellen, die implementiert werden können. Die Steuerelemente GridView, DetailsView und FormView bieten vier verschiedene Schnittstellen zur Auswahl:

  • Als Nächstes können vorherige Benutzer jeweils eine Seite verschieben, entweder zur nächsten oder zur vorherigen Seite.
  • Weiter, Vorherige, Erste, Letzte Neben den Schaltflächen Weiter und Zurück enthält diese Benutzeroberfläche die Schaltflächen First und Last, um zur ersten oder sehr letzten Seite zu wechseln.
  • Numerisch listet die Seitenzahlen in der Pagingschnittstelle auf, sodass ein Benutzer schnell zu einer bestimmten Seite springen kann.
  • Numeric, First, Last zusätzlich zu den numerischen Seitenzahlen enthält Schaltflächen zum Verschieben zur ersten oder sehr letzten Seite.

Für dataList und Repeater sind wir für die Entscheidung über eine Pagingschnittstelle und deren Implementierung verantwortlich. Dies umfasst das Erstellen der erforderlichen Websteuerelemente auf der Seite und das Anzeigen der angeforderten Seite, wenn auf eine bestimmte Schaltfläche für die Pagingschnittstelle geklickt wird. Darüber hinaus müssen bestimmte Pagingschnittstellensteuerelemente möglicherweise deaktiviert werden. Wenn Sie beispielsweise die erste Seite der Daten mit der Schnittstelle Weiter, Vorheriger, Erster, Letzter anzeigen, werden sowohl die Schaltflächen Zuerst als auch Zurück deaktiviert.

Verwenden Sie für dieses Tutorial die Schnittstelle Next, Previous, First, Last. Fügen Sie der Seite vier Schaltflächen-Websteuerelemente hinzu, und legen Sie deren ID s auf FirstPage, PrevPage, NextPageund LastPagefest. Legen Sie die Text Eigenschaften auf << First, < Prev, Next >und Last >> fest.

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

Erstellen Sie als Nächstes einen Click Ereignishandler für jede dieser Schaltflächen. In einem Moment fügen wir den Code hinzu, der zum Anzeigen der angeforderten Seite erforderlich ist.

Speichern der Gesamtanzahl der Datensätze, die ausgelagert werden

Unabhängig von der ausgewählten Pagingschnittstelle müssen wir die Gesamtanzahl der Datensätze berechnen und sich merken, die ausgelagert werden. Die Gesamtanzahl der Zeilen (in Verbindung mit der Seitengröße) bestimmt, wie viele Datenseiten insgesamt ausgelagert werden, wodurch bestimmt wird, welche Pagingschnittstellensteuerelemente hinzugefügt oder aktiviert werden. In der Schnittstelle Next, Previous, First, Last, die wir gerade erstellen, wird die Seitenanzahl auf zwei Arten verwendet:

  • Um zu bestimmen, ob die letzte Seite angezeigt wird. In diesem Fall sind die Schaltflächen Weiter und Zuletzt deaktiviert.
  • Wenn der Benutzer auf die Schaltfläche "Zuletzt" klickt, müssen wir sie zur letzten Seite bringen, deren Index eins kleiner als die Seitenanzahl ist.

Die Seitenanzahl wird als Obergrenze der gesamten Zeilenanzahl dividiert durch die Seitengröße berechnet. Wenn wir beispielsweise 79 Datensätze mit vier Datensätzen pro Seite durchlaufen, ist die Seitenanzahl 20 (die Obergrenze von 79 /4). Wenn wir die Numerische Paging-Schnittstelle verwenden, informieren uns diese Informationen darüber, wie viele numerische Seitenschaltflächen angezeigt werden sollen. Wenn unsere Pagingschnittstelle die Schaltflächen Next oder Last enthält, wird die Seitenanzahl verwendet, um zu bestimmen, wann die Schaltflächen Weiter oder Zuletzt deaktiviert werden soll.

Wenn die Pagingschnittstelle eine Schaltfläche "Zuletzt" enthält, ist es zwingend erforderlich, dass die Gesamtanzahl der Datensätze, durch die ausgelagert werden, über Postbacks hinweg gespeichert wird, damit beim Klicken auf die Schaltfläche Zuletzt der Index der letzten Seite bestimmt werden kann. Um dies zu erleichtern, erstellen Sie eine TotalRowCount Eigenschaft in der CodeBehind-Klasse der ASP.NET Seite, die ihren Wert zum Anzeigen des Zustands beibehalten:

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

Nehmen Sie sich zusätzlich eine Minute Zeit, TotalRowCountum schreibgeschützte Eigenschaften auf Seitenebene für den einfachen Zugriff auf den Seitenindex, die Seitengröße und die Seitenanzahl zu erstellen:

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

Ermitteln der Gesamtanzahl der Datensätze, die ausgelagert werden

Das PagedDataSource von der ObjectDataSource-Methode Select() zurückgegebene Objekt enthält alle Produktdatensätze, obwohl nur eine Teilmenge von ihnen in der DataList angezeigt wird. Die PagedDataSources-EigenschaftCount gibt nur die Anzahl der Elemente zurück, die in der DataList angezeigt werden. Die DataSourceCount -Eigenschaft gibt die Gesamtzahl der Elemente innerhalb des PagedDataSourcezurück. Daher müssen wir der ASP.NET-Eigenschaft der Seite TotalRowCount den Wert der PagedDataSource s-Eigenschaft DataSourceCount zuweisen.

Erstellen Sie hierzu einen Ereignishandler für das ObjectDataSource-Ereignis Selected . Selected Im Ereignishandler haben wir Zugriff auf den Rückgabewert der ObjectDataSource-Methode Select() in diesem Fall.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

Anzeigen der angeforderten Datenseite

Wenn der Benutzer auf eine der Schaltflächen in der Pagingoberfläche klickt, müssen wir die angeforderte Datenseite anzeigen. Da die Pagingparameter über die Abfragezeichenfolge angegeben werden, verwenden Response.Redirect(url) Sie zum Anzeigen der angeforderten Datenseite, damit der Browser des Benutzers die Paging.aspx Seite mit den entsprechenden Pagingparametern erneut anfordert. Um z. B. die zweite Datenseite anzuzeigen, würden wir den Benutzer zu Paging.aspx?pageIndex=1umleiten.

Um dies zu erleichtern, erstellen Sie eine RedirectUser(sendUserToPageIndex) Methode, die den Benutzer zu Paging.aspx?pageIndex=sendUserToPageIndexumleitet. Rufen Sie dann diese Methode aus den vier Button-Ereignishandlern Click auf. Rufen Sie RedirectUser(0)imClickFirstPageEreignishandler auf, um sie an die erste Seite zu senden. Verwenden Sie PageIndex - 1 im PrevPageClick Ereignishandler als Seitenindex usw.

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

Wenn die Click Ereignishandler abgeschlossen sind, können die DataList-Datensätze durch einen Klick auf die Schaltflächen ausgelagert werden. Nehmen Sie sich einen Moment Zeit, um es auszuprobieren!

Deaktivieren von Paging-Schnittstellensteuerelementen

Derzeit sind alle vier Schaltflächen unabhängig von der angezeigten Seite aktiviert. Wir möchten jedoch die Schaltflächen First und Previous deaktivieren, wenn die erste Datenseite angezeigt wird, und die Schaltflächen "Weiter" und "Zuletzt", wenn die letzte Seite angezeigt wird. Das PagedDataSource von der ObjectDataSource-Methode Select() zurückgegebene Objekt verfügt über Eigenschaften IsFirstPage , die IsLastPage wir untersuchen können, um festzustellen, ob die erste oder letzte Seite der Daten angezeigt wird.

Fügen Sie dem ObjectDataSource-Ereignishandler Selected Folgendes hinzu:

' 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

Mit dieser Ergänzung werden die Schaltflächen First und Previous beim Anzeigen der ersten Seite deaktiviert, während die Schaltflächen Next und Last beim Anzeigen der letzten Seite deaktiviert werden.

Vervollständigen Sie die Paging-Schnittstelle, indem Sie den Benutzer darüber informieren, welche Seite derzeit angezeigt wird und wie viele Seiten insgesamt vorhanden sind. Fügen Sie der Seite ein Label-Websteuerelement hinzu, und legen Sie dessen ID Eigenschaft auf fest CurrentPageNumber. Legen Sie ihre Text Eigenschaft im ObjectDataSource s Selected-Ereignishandler so fest, dass er die aktuell angezeigte Seite (PageIndex + 1) und die Gesamtzahl der Seiten (PageCount) enthält.

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

Abbildung 10 zeigt Paging.aspx , wann er zum ersten Mal besucht wird. Da die Abfragezeichenfolge leer ist, zeigt dataList standardmäßig die ersten vier Produkte an. Die Schaltflächen First und Previous sind deaktiviert. Wenn Sie auf Weiter klicken, werden die nächsten vier Datensätze angezeigt (siehe Abbildung 11). Die Schaltflächen First und Previous sind jetzt aktiviert.

Die erste Seite der Daten wird angezeigt

Abbildung 10: Die erste Seite der Daten wird angezeigt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Screenshot: Seite 2 der Auslagerungsdaten in einem DataList-Fenster

Abbildung 11: Die zweite Seite der Daten wird angezeigt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Hinweis

Die Pagingschnittstelle kann weiter verbessert werden, indem der Benutzer angeben kann, wie viele Seiten pro Seite angezeigt werden sollen. Beispielsweise könnte eine DropDownList Optionen für die Listenseitengröße wie 5, 10, 25, 50 und Alle hinzugefügt werden. Beim Auswählen einer Seitengröße muss der Benutzer zurück zu Paging.aspx?pageIndex=0&pageSize=selectedPageSizeweitergeleitet werden. Ich belasse die Implementierung dieser Erweiterung als Übung für den Leser.

Verwenden von benutzerdefiniertem Paging

Die DataList-Seiten durchlaufen ihre Daten mithilfe der ineffizienten Standardpapageing-Technik. Beim Durchlaufen ausreichend großer Datenmengen ist es zwingend erforderlich, benutzerdefiniertes Paging zu verwenden. Obwohl sich die Implementierungsdetails geringfügig unterscheiden, sind die Konzepte für die Implementierung des benutzerdefinierten Pagings in einer DataList identisch mit dem Standardpa paging. Verwenden Sie beim benutzerdefinierten Paging die Methode s GetProductsPaged der ProductBLL Klasse (anstelle von GetProductsAsPagedDataSource). Wie im Tutorial Effizientes Paging durch große Datenmengen erläutert, GetProductsPaged müssen der Startzeilenindex und die maximale Anzahl der zurückgegebenen Zeilen übergeben werden. Diese Parameter können über die Abfragezeichenfolge verwaltet werden, genau wie die Parameter undpageSize, die pageIndex beim Standardpa paging verwendet werden.

Da es kein PagedDataSource benutzerdefiniertes Paging gibt, müssen alternative Techniken verwendet werden, um die Gesamtzahl der Datensätze zu bestimmen, durch die ausgelagert werden, und ob die erste oder letzte Datenseite angezeigt wird. Die TotalNumberOfProducts() -Methode in der ProductsBLL -Klasse gibt die Gesamtanzahl der Produkte zurück, die durchlaufen werden. Um zu bestimmen, ob die erste Seite der Daten angezeigt wird, untersuchen Sie den Startzeilenindex, wenn er 0 ist, und dann wird die erste Seite angezeigt. Die letzte Seite wird angezeigt, wenn der Startzeilenindex und die maximal zurückgegebenen Zeilen größer oder gleich der Gesamtzahl der Datensätze sind, die ausgelagert werden.

Im nächsten Tutorial wird die Implementierung von benutzerdefiniertem Paging ausführlicher erläutert.

Zusammenfassung

Während weder dataList noch Repeater die sofort einsatzbereite Pagingunterstützung in den GridView-, DetailsView- und FormView-Steuerelementen bieten, kann diese Funktionalität mit minimalem Aufwand hinzugefügt werden. Die einfachste Möglichkeit zum Implementieren von Standard paging besteht darin, den gesamten Satz von Produkten in einem PagedDataSource zu umschließen und dann an PagedDataSource die DataList oder den Repeater zu binden. In diesem Tutorial haben wir die GetProductsAsPagedDataSource -Methode der ProductsBLL -Klasse hinzugefügt, um zurückzugeben PagedDataSource. Die ProductsBLL -Klasse enthält bereits die Methoden, die für benutzerdefiniertes Paging GetProductsPaged und TotalNumberOfProductserforderlich sind.

Neben dem Abrufen des genauen Datensatzes, der für das benutzerdefinierte Paging angezeigt werden soll, oder alle Datensätze in einem PagedDataSource für standard paging, müssen wir auch die Pagingschnittstelle manuell hinzufügen. Für dieses Tutorial haben wir eine Next, Previous, First, Last-Schnittstelle mit vier Schaltflächen-Websteuerelementen erstellt. Außerdem wurde ein Label-Steuerelement hinzugefügt, das die aktuelle Seitenzahl und die Gesamtanzahl der Seiten anzeigt.

Im nächsten Tutorial erfahren Sie, wie Sie der DataList und dem Repeater die Sortierunterstützung hinzufügen. Außerdem erfahren Sie, wie Sie eine DataList erstellen, die sowohl ausgelagert als auch sortiert werden kann (mit Beispielen, die standard- und benutzerdefiniertes Paging verwenden).

Viel Spaß beim Programmieren!

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET-Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.

Besonderen Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Leitende Prüfer für dieses Tutorial waren Liz Shulok, Ken Pespisa und Bernadette Leigh. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.