Auslagern von Berichtsdaten in einem DataList- oder Wiederholungssteuerelement (VB)
von Scott Mitchell
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.master
konfiguriert sind:
Default.aspx
Paging.aspx
Sorting.aspx
SortingWithDefaultPaging.aspx
SortingWithCustomPaging.aspx
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.
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>
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 PagedDataSource
gibt 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.
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, undpageSize
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.
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.
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. pageIndex
Legen Sie für den Standardwert auf 0 (die erste Datenseite) und pageSize
den Standardwert auf 4 fest.
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.
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).
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
, NextPage
und LastPage
fest. 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, TotalRowCount
um 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 PagedDataSource
s-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 PagedDataSource
zurü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=1
umleiten.
Um dies zu erleichtern, erstellen Sie eine RedirectUser(sendUserToPageIndex)
Methode, die den Benutzer zu Paging.aspx?pageIndex=sendUserToPageIndex
umleitet. Rufen Sie dann diese Methode aus den vier Button-Ereignishandlern Click
auf. Rufen Sie RedirectUser(0)
imClick
FirstPage
Ereignishandler auf, um sie an die erste Seite zu senden. Verwenden Sie PageIndex - 1
im PrevPage
Click
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.
Abbildung 10: Die erste Seite der Daten wird angezeigt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
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=selectedPageSize
weitergeleitet 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 TotalNumberOfProducts
erforderlich 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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für