Share via


Sortieren von Daten in einem DataList- oder Wiederholungssteuerelement (VB)

von Scott Mitchell

PDF herunterladen

In diesem Tutorial erfahren Sie, wie Sie die Sortierunterstützung in DataList und Repeater einschließen und wie Sie eine DataList oder einen Repeater erstellen, deren Daten ausgelagert und sortiert werden können.

Einführung

Im vorherigen Tutorial haben wir uns mit dem Hinzufügen von Pagingunterstützung zu einer DataList befasst. Wir haben eine neue Methode in der ProductsBLL -Klasse (GetProductsAsPagedDataSource) erstellt, die ein PagedDataSource -Objekt zurückgegeben hat. Wenn sie an eine DataList oder einen Repeater gebunden ist, zeigt die DataList oder der Repeater nur die angeforderte Seite der Daten an. Diese Technik ähnelt dem, was intern von den GridView-, DetailsView- und FormView-Steuerelementen verwendet wird, um die integrierte Standardpa paging-Funktionalität bereitzustellen.

Zusätzlich zur Unterstützung von Paging bietet GridView auch sofort einsatzbereite Sortierunterstützung. Weder dataList noch Repeater bieten integrierte Sortierfunktionen. Sortierfunktionen können jedoch mit etwas Code hinzugefügt werden. In diesem Tutorial erfahren Sie, wie Sie die Sortierunterstützung in DataList und Repeater einschließen und wie Sie eine DataList oder einen Repeater erstellen, deren Daten ausgelagert und sortiert werden können.

Eine Überprüfung der Sortierung

Wie wir im Tutorial Paging and Sorting Report Data gesehen haben, bietet das GridView-Steuerelement eine sofort einsatzbereite Sortierunterstützung. Jedem GridView-Feld kann eine zugeordnete SortExpressionsein, die das Datenfeld angibt, nach dem die Daten sortiert werden sollen. Wenn die GridView-Eigenschaft AllowSorting auf truefestgelegt ist, wird für jedes GridView-Feld mit einem SortExpression Eigenschaftswert der Header als LinkButton gerendert. Wenn ein Benutzer auf eine bestimmte Kopfzeile des GridView-Felds klickt, erfolgt ein Postback, und die Daten werden nach den geklickten Felds sortiert SortExpression.

Das GridView-Steuerelement verfügt ebenfalls über eine SortExpression -Eigenschaft, die den des SortExpression GridView-Felds speichert, nach dem die Daten sortiert werden. Darüber hinaus gibt eine SortDirection Eigenschaft an, ob die Daten in aufsteigender oder absteigender Reihenfolge sortiert werden sollen (wenn ein Benutzer zweimal hintereinander auf einen bestimmten Headerlink des GridView-Felds klickt, wird die Sortierreihenfolge umgeschaltet).

Wenn gridView an sein Datenquellensteuerelement gebunden ist, übergibt es seine SortExpression Eigenschaften und SortDirection an das Datenquellensteuerelement. Das Datenquellensteuerelement ruft die Daten ab und sortiert sie dann nach den angegebenen SortExpression Eigenschaften und SortDirection . Nach dem Sortieren der Daten gibt das Datenquellensteuerelement sie an GridView zurück.

Um diese Funktionalität mit den DataList- oder Repeater-Steuerelementen zu replizieren, müssen wir:

  • Erstellen einer Sortierschnittstelle
  • Merken Sie sich das Datenfeld, nach dem sortiert werden soll, und ob in aufsteigender oder absteigender Reihenfolge sortiert werden soll.
  • Weisen Sie die ObjectDataSource an, die Daten nach einem bestimmten Datenfeld zu sortieren.

Diese drei Aufgaben werden in den Schritten 3 und 4 behandelt. Anschließend untersuchen wir, wie Sie die Unterstützung für Paging und Sortierung in eine DataList oder einen Repeater einschließen.

Schritt 2: Anzeigen der Produkte in einem Repeater

Bevor wir uns gedanken über die Implementierung einer sortierbezogenen Funktionalität machen, beginnen wir mit der Auflistung der Produkte in einem Repeater-Steuerelement. Öffnen Sie zunächst die Sorting.aspx Seite im PagingSortingDataListRepeater Ordner. Fügen Sie der Webseite ein Repeater-Steuerelement hinzu, und legen Sie dessen ID -Eigenschaft auf fest SortableProducts. Erstellen Sie aus dem Smarttag des Repeaters eine neue ObjectDataSource mit dem Namen ProductsDataSource , und konfigurieren Sie sie so, dass Daten aus der s-Methode der ProductsBLL Klasse GetProducts() abgerufen werden. Wählen Sie in den Dropdownlisten auf den Registerkarten INSERT, UPDATE und DELETE die Option (Keine) aus.

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

Abbildung 1: Erstellen sie eine ObjectDataSource, und konfigurieren Sie sie für die Verwendung der GetProductsAsPagedDataSource() -Methode (Klicken Sie hier, um ein Bild in voller Größe anzuzeigen)

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

Abbildung 2: Festlegen der Drop-Down Listen auf den Registerkarten UPDATE, INSERT und DELETE auf (Keine) (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Im Gegensatz zu DataList erstellt Visual Studio nicht automatisch eine ItemTemplate für das Repeater-Steuerelement, nachdem es an eine Datenquelle gebunden wurde. Darüber hinaus müssen wir dies ItemTemplate deklarativ hinzufügen, da dem Smarttag des Repeater-Steuerelements die Option Vorlagen bearbeiten in den DataLists fehlt. Lassen Sie uns den gleichen ItemTemplate aus dem vorherigen Tutorial verwenden, in dem der Name, der Lieferant und die Kategorie des Produkts angezeigt wurden.

Nach dem Hinzufügen von ItemTemplatesollte das deklarative Markup repeater und ObjectDataSource in etwa wie folgt aussehen:

<asp:Repeater ID="SortableProducts" DataSourceID="ProductsDataSource"
    EnableViewState="False" runat="server">
    <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>
</asp:Repeater>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProducts">
</asp:ObjectDataSource>

Abbildung 3 zeigt diese Seite, wenn sie über einen Browser angezeigt wird.

Name, Lieferant und Kategorie jedes Produkts werden angezeigt.

Abbildung 3: Name, Lieferant und Kategorie jedes Produkts werden angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 3: Anweisen der ObjectDataSource, die Daten zu sortieren

Um die im Repeater angezeigten Daten zu sortieren, müssen wir die ObjectDataSource über den Sortierausdruck informieren, nach dem die Daten sortiert werden sollen. Bevor die ObjectDataSource ihre Daten abruft, löst sie zunächst das Selecting -Ereignis aus, das uns die Möglichkeit bietet, einen Sortierausdruck anzugeben. Dem Selecting Ereignishandler wird ein Objekt vom Typ ObjectDataSourceSelectingEventArgsübergeben, das über eine Eigenschaft namens vom Arguments Typ DataSourceSelectArgumentsverfügt. Die DataSourceSelectArguments -Klasse wurde entwickelt, um datenbezogene Anforderungen von einem Consumer von Daten an das Datenquellensteuerelement zu übergeben, und enthält eine SortExpression -Eigenschaft.

Um Sortierinformationen von der seite ASP.NET an objectDataSource zu übergeben, erstellen Sie einen Ereignishandler für das Selecting Ereignis, und verwenden Sie den folgenden Code:

Protected Sub ProductsDataSource_Selecting(ByVal sender As Object, _
    ByVal e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    e.Arguments.SortExpression = sortExpression
End Sub

Dem sortExpression-Wert sollte der Name des Datenfelds zugewiesen werden, nach dem die Daten sortiert werden sollen (z. B. ProductName ). Es gibt keine richtungsbezogene Sortiereigenschaft. Wenn Sie die Daten also in absteigender Reihenfolge sortieren möchten, fügen Sie die Zeichenfolge DESC an den SortExpression-Wert an (z. B. ProductName DESC ).

Probieren Sie verschiedene hartcodierte Werte für sortExpression aus, und testen Sie die Ergebnisse in einem Browser. Wie Abbildung 4 zeigt, werden die Produkte bei Verwendung von ProductName DESC als sortExpression in umgekehrter alphabetischer Reihenfolge nach ihrem Namen sortiert.

Die Produkte werden nach ihrem Namen in umgekehrter alphabetischer Reihenfolge sortiert.

Abbildung 4: Die Produkte werden nach ihrem Namen in umgekehrter alphabetischer Reihenfolge sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 4: Erstellen der Sortierschnittstelle und Speichern des Sortierausdrucks und der Richtung

Wenn Sie die Sortierunterstützung in GridView aktivieren, wird der Headertext jedes sortierbaren Felds in ein LinkButton-Objekt konvertiert, das die Daten nach dem Klicken entsprechend sortiert. Eine solche Sortierschnittstelle ist für gridView sinnvoll, bei dem die Daten sauber in Spalten angeordnet sind. Für die DataList- und Repeater-Steuerelemente ist jedoch eine andere Sortierschnittstelle erforderlich. Eine gängige Sortierschnittstelle für eine Liste von Daten (im Gegensatz zu einem Datenraster) ist eine Dropdownliste, die die Felder bereitstellt, nach denen die Daten sortiert werden können. Lassen Sie uns eine solche Schnittstelle für dieses Tutorial implementieren.

Fügen Sie ein DropDownList-Websteuerelement über dem SortableProducts Repeater hinzu, und legen Sie dessen ID Eigenschaft auf fest SortBy. Klicken Sie in der Eigenschaftenfenster auf die Auslassungspunkte in der Items -Eigenschaft, um die Editor ListItem-Auflistung anzuzeigen. Fügen Sie s hinzu ListItem , um die Daten nach den ProductNameFeldern , CategoryNameund SupplierName zu sortieren. Fügen Sie außerdem ein hinzu ListItem , um die Produkte nach ihrem Namen in umgekehrter alphabetischer Reihenfolge zu sortieren.

Die ListItemText Eigenschaften können auf einen beliebigen Wert (z. B. Name ) festgelegt werden, aber die Value Eigenschaften müssen auf den Namen des Datenfelds festgelegt werden (z. B. ProductName ). Um die Ergebnisse in absteigender Reihenfolge zu sortieren, fügen Sie die Zeichenfolge DESC an den Datenfeldnamen an, z. B. ProductName DESC .

Hinzufügen eines ListItem für jedes der sortierbaren Datenfelder

Abbildung 5: Hinzufügen eines ListItem für jedes der sortierbaren Datenfelder

Fügen Sie schließlich rechts neben der DropDownList ein Button-Websteuerelement hinzu. Legen Sie auf IDRefreshRepeater und die - Text Eigenschaft auf Aktualisieren fest.

Nach dem Erstellen der ListItem s und dem Hinzufügen der Schaltfläche Aktualisieren sollte die deklarative Syntax von DropDownList und Button in etwa wie folgt aussehen:

<asp:DropDownList ID="SortBy" runat="server">
    <asp:ListItem Value="ProductName">Name</asp:ListItem>
    <asp:ListItem Value="ProductName DESC">Name (Reverse Order)
        </asp:ListItem>
    <asp:ListItem Value="CategoryName">Category</asp:ListItem>
    <asp:ListItem Value="SupplierName">Supplier</asp:ListItem>
</asp:DropDownList>
<asp:Button runat="server" ID="RefreshRepeater" Text="Refresh" />

Nachdem das Sortieren von DropDownList abgeschlossen ist, müssen wir als Nächstes Selecting den ObjectDataSource-Ereignishandler aktualisieren, sodass er die ausgewählte SortBy``ListItem s-Eigenschaft Value anstelle eines hartcodierten Sortierausdrucks verwendet.

Protected Sub ProductsDataSource_Selecting _
    (ByVal sender As Object, ByVal e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    ' Have the ObjectDataSource sort the results by the
    ' selected sort expression
    e.Arguments.SortExpression = SortBy.SelectedValue
End Sub

Wenn Sie die Seite zum ersten Mal besuchen, werden die Produkte zunächst nach dem ProductName Datenfeld sortiert, da es sich dabei standardmäßig um die SortByListItem ausgewählte handelt (siehe Abbildung 6). Wenn Sie eine andere Sortieroption wie Kategorie auswählen und auf Aktualisieren klicken, wird ein Postback ausgelöst und die Daten wie in Abbildung 7 dargestellt nach dem Kategorienamen neu sortiert.

Die Produkte werden zunächst nach ihrem Namen sortiert.

Abbildung 6: Die Produkte werden zunächst nach ihrem Namen sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Die Produkte sind jetzt nach Kategorie sortiert.

Abbildung 7: Die Produkte sind jetzt nach Kategorie sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Durch Klicken auf die Schaltfläche Aktualisieren werden die Daten automatisch neu sortiert, da der Ansichtszustand des Repeaters deaktiviert wurde, wodurch der Repeater bei jedem Postback erneut an seine Datenquelle binden kann. Wenn Sie den Ansichtszustand des Repeaters aktiviert haben, hat das Ändern der Sortierliste keine Auswirkungen auf die Sortierreihenfolge. Um dies zu beheben, erstellen Sie einen Ereignishandler für das Refresh Button-Ereignis, Click und binden Sie den Repeater erneut an seine Datenquelle (durch Aufrufen der Repeater-Methode).DataBind()

Speichern des Sortierausdrucks und der Richtung

Beim Erstellen einer sortierbaren DataList oder eines Repeaters auf einer Seite, auf der nicht sortierbare Postbacks auftreten können, ist es zwingend erforderlich, dass der Sortierausdruck und die Sortierrichtung über Postbacks hinweg gespeichert werden. Stellen Sie sich beispielsweise vor, dass wir den Repeater in diesem Tutorial aktualisiert haben, um für jedes Produkt eine Schaltfläche Löschen einzuschließen. Wenn der Benutzer auf die Schaltfläche Löschen klickt, führen wir code aus, um das ausgewählte Produkt zu löschen und die Daten dann erneut an den Repeater zu binden. Wenn die Sortierdetails nicht über das Postback hinweg beibehalten werden, rückgängig machen die auf dem Bildschirm angezeigten Daten zur ursprünglichen Sortierreihenfolge.

In diesem Tutorial speichert DropDownList implizit den Sortierausdruck und die Richtung in seinem Ansichtszustand für uns. Wenn wir eine andere Sortierschnittstelle verwenden würden, z. B. mit LinkButtons, die die verschiedenen Sortieroptionen bereitstellte, müssen wir darauf achten, die Sortierreihenfolge über Postbacks hinweg zu speichern. Dies kann erreicht werden, indem die Sortierparameter im Ansichtszustand der Seite gespeichert werden, indem der Sortierparameter in die Abfragezeichenfolge eingeschlossen wird, oder durch eine andere Zustandspersistenztechnik.

In zukünftigen Beispielen in diesem Tutorial wird erläutert, wie die Sortierdetails im Ansichtszustand der Seite beibehalten werden.

Schritt 5: Hinzufügen der Sortierunterstützung zu einer DataList, die standard paging verwendet

Im vorherigen Tutorial haben wir uns mit der Implementierung von Standard paging mit einer DataList befasst. Lassen Sie uns dieses vorherige Beispiel erweitern, um die Möglichkeit zum Sortieren der ausgelagerten Daten einzuschließen. Öffnen Sie zunächst die SortingWithDefaultPaging.aspx Seiten und Paging.aspx im PagingSortingDataListRepeater Ordner. Klicken Sie auf der Paging.aspx Seite auf die Schaltfläche Quelle, um das deklarative Markup der Seite anzuzeigen. Kopieren Sie den markierten Text (siehe Abbildung 8), und fügen Sie ihn in das deklarative Markup von SortingWithDefaultPaging.aspx zwischen den <asp:Content> Tags ein.

Replizieren des deklarativen Markups in den <asp:Content-Tags> aus Paging.aspx in SortingWithDefaultPaging.aspx

Abbildung 8: Replizieren des deklarativen Markups in den <asp:Content> Tags von Paging.aspx bis SortingWithDefaultPaging.aspx (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Kopieren Sie nach dem Kopieren des deklarativen Markups die Methoden und Eigenschaften in der CodeBehind-Klasse der Paging.aspx Seite in die CodeBehind-Klasse für SortingWithDefaultPaging.aspx. Nehmen Sie sich als Nächstes zeit, um die SortingWithDefaultPaging.aspx Seite in einem Browser anzuzeigen. Es sollte die gleiche Funktionalität und Darstellung aufweisen wie Paging.aspx.

Verbessern von ProductsBLL, um eine Standardmäßige Paging- und Sortiermethode einzuschließen

Im vorherigen Tutorial haben wir eine GetProductsAsPagedDataSource(pageIndex, pageSize) Methode in der -Klasse erstellt, die ProductsBLL ein PagedDataSource -Objekt zurückgegeben hat. Dieses PagedDataSource Objekt wurde mit allen Produkten aufgefüllt (über die BLL-Methode), GetProducts() aber wenn sie an die DataList gebunden wurde, wurden nur die Datensätze angezeigt, die den angegebenen Eingabeparametern pageIndex und pageSize entsprechen.

Weiter oben in diesem Tutorial wurde die Sortierunterstützung durch Angabe des Sortierausdrucks aus dem ObjectDataSource-Ereignishandler Selecting hinzugefügt. Dies funktioniert gut, wenn objectDataSource ein Objekt zurückgegeben wird, das sortiert werden kann, z. B. das ProductsDataTable von der GetProducts() -Methode zurückgegebene. Das von der PagedDataSourceGetProductsAsPagedDataSource -Methode zurückgegebene Objekt unterstützt jedoch keine Sortierung seiner inneren Datenquelle. Stattdessen müssen wir die von der GetProducts() -Methode zurückgegebenen Ergebnisse sortieren, bevor wir sie in die PagedDataSource-Methode einfügen.

Um dies zu erreichen, erstellen Sie eine neue Methode in der ProductsBLL -Klasse, GetProductsSortedAsPagedDataSource(sortExpression, pageIndex, pageSize). Um die ProductsDataTable von der GetProducts() -Methode zurückgegebene zu sortieren, geben Sie die Sort -Eigenschaft des -Standardwerts DataTableViewan:

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

Die GetProductsSortedAsPagedDataSource -Methode unterscheidet sich nur geringfügig von der Methode, die GetProductsAsPagedDataSource im vorherigen Tutorial erstellt wurde. Akzeptiert insbesondere GetProductsSortedAsPagedDataSource einen zusätzlichen Eingabeparameter sortExpression und weist diesen Wert der Sort -Eigenschaft von ProductDataTable s DefaultViewzu. Ein paar Codezeilen später wird dem PagedDataSource Objekt s DataSource der ProductDataTable s DefaultViewzugewiesen.

Aufrufen der GetProductsSortedAsPagedDataSource-Methode und Angeben des Werts für den SortExpression-Eingabeparameter

Wenn die GetProductsSortedAsPagedDataSource -Methode abgeschlossen ist, besteht der nächste Schritt darin, den Wert für diesen Parameter bereitzustellen. Die ObjectDataSource in SortingWithDefaultPaging.aspx ist derzeit so konfiguriert, dass die GetProductsAsPagedDataSource -Methode aufgerufen wird und die beiden Eingabeparameter über die beiden QueryStringParametersin der SelectParameters Auflistung angegebenen übergeben werden. Diese beiden QueryStringParameters geben an, dass die Quelle für die GetProductsAsPagedDataSource Parameter pageIndex und pageSize der Methode aus den Querystring-Feldern pageIndex und pageSizestammen.

Aktualisieren Sie die ObjectDataSource-Eigenschaft SelectMethod , sodass sie die neue GetProductsSortedAsPagedDataSource Methode aufruft. Fügen Sie dann eine neue QueryStringParameter hinzu, damit über das Querystring-Feld sortExpressionauf den eingabeparameter sortExpression zugegriffen wird. Legen Sie die QueryStringParameter s DefaultValue auf ProductName fest.

Nach diesen Änderungen sollte das deklarative Markup von ObjectDataSource wie folgt aussehen:

<asp:ObjectDataSource ID="ProductsDefaultPagingDataSource"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsSortedAsPagedDataSource"
    OnSelected="ProductsDefaultPagingDataSource_Selected" runat="server">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="ProductName"
            Name="sortExpression" QueryStringField="sortExpression"
            Type="String" />
        <asp:QueryStringParameter DefaultValue="0" Name="pageIndex"
            QueryStringField="pageIndex" Type="Int32" />
        <asp:QueryStringParameter DefaultValue="4" Name="pageSize"
            QueryStringField="pageSize" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

An diesem Punkt sortiert die SortingWithDefaultPaging.aspx Seite ihre Ergebnisse alphabetisch nach dem Produktnamen (siehe Abbildung 9). Dies liegt daran, dass standardmäßig der Wert ProductName als SortExpression-Parameter der GetProductsSortedAsPagedDataSource Methode übergeben wird.

Standardmäßig werden die Ergebnisse nach ProductName sortiert.

Abbildung 9: Standardmäßig sind die Ergebnisse nach ProductName sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wenn Sie manuell ein sortExpression Abfragezeichenfolgenfeld hinzufügen, z SortingWithDefaultPaging.aspx?sortExpression=CategoryName . B. werden die Ergebnisse nach dem angegebenen sortExpressionsortiert. Dieser sortExpression Parameter ist jedoch nicht in der Abfragezeichenfolge enthalten, wenn sie zu einer anderen Datenseite verschoben wird. Wenn Sie auf die Schaltflächen "Nächste Seite" oder "Letzte Seite" klicken, gelangen Sie zurück zu Paging.aspx! Darüber hinaus gibt es derzeit keine Sortierschnittstelle. Die einzige Möglichkeit, die Sortierreihenfolge der ausgelagerten Daten zu ändern, besteht darin, die Abfragezeichenfolge direkt zu bearbeiten.

Erstellen der Sortierschnittstelle

Wir müssen zuerst die RedirectUser -Methode aktualisieren, um den Benutzer (anstelle von Paging.aspx) zu SortingWithDefaultPaging.aspx senden, und den sortExpression Wert in die Abfragezeichenfolge einzuschließen. Wir sollten auch eine schreibgeschützte benannte SortExpression Eigenschaft auf Seitenebene hinzufügen. Diese Eigenschaft, ähnlich wie die PageIndex im vorherigen Tutorial erstellten Eigenschaften und PageSize , gibt den Wert des sortExpression Abfragezeichenfolgenfelds zurück, sofern vorhanden, und andernfalls den Standardwert ( ProductName ).

Derzeit akzeptiert die RedirectUser -Methode nur einen einzelnen Eingabeparameter, den der Index der anzuzeigenden Seite enthält. Es kann jedoch vorkommen, dass wir den Benutzer mithilfe eines anderen Sortierausdrucks als dem, was in der Abfragezeichenfolge angegeben ist, zu einer bestimmten Datenseite umleiten möchten. In kürze erstellen wir die Sortierschnittstelle für diese Seite, die eine Reihe von Button-Websteuerelementen zum Sortieren der Daten nach einer angegebenen Spalte enthält. Wenn auf eine dieser Schaltflächen geklickt wird, möchten wir den Benutzer umleiten, der den entsprechenden Sortierausdruckswert übergibt. Um diese Funktionalität bereitzustellen, erstellen Sie zwei Versionen der RedirectUser -Methode. Die erste sollte nur den anzuzeigenden Seitenindex akzeptieren, während der zweite den Seitenindex und den Sortierausdruck akzeptiert.

Private ReadOnly Property SortExpression() As String
    Get
        If Not String.IsNullOrEmpty(Request.QueryString("sortExpression")) Then
            Return Request.QueryString("sortExpression")
        Else
            Return "ProductName"
        End If
    End Get
End Property
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer)
    ' Use the SortExpression property to get the sort expression
    ' from the querystring
    RedirectUser(sendUserToPageIndex, SortExpression)
End Sub
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer,
    ByVal sendUserSortingBy As String)
    ' Send the user to the requested page with the
    ' requested sort expression
    Response.Redirect(String.Format("SortingWithDefaultPaging.aspx?" & _
        "pageIndex={0}&pageSize={1}&sortExpression={2}", _
        sendUserToPageIndex, PageSize, sendUserSortingBy))
End Sub

Im ersten Beispiel in diesem Tutorial haben wir eine Sortierschnittstelle mithilfe einer DropDownList erstellt. In diesem Beispiel verwenden wir drei Button Web-Steuerelemente, die sich über dem DataList-Steuerelement befinden, zum Sortieren nach ProductName, eines für CategoryNameund eines für SupplierName. Fügen Sie die drei Button-Websteuerelemente hinzu, und legen Sie deren ID Eigenschaften und Text entsprechend fest:

<p>
    <asp:Button runat="server" id="SortByProductName"
        Text="Sort by Product Name" />
    <asp:Button runat="server" id="SortByCategoryName"
        Text="Sort by Category" />
    <asp:Button runat="server" id="SortBySupplierName"
        Text="Sort by Supplier" />
</p>

Erstellen Sie als Nächstes für jeden einen Click Ereignishandler. Die Ereignishandler sollten die RedirectUser -Methode aufrufen und den Benutzer mithilfe des entsprechenden Sortierausdrucks zur ersten Seite zurückgeben.

Protected Sub SortByProductName_Click(sender As Object, e As EventArgs) _
    Handles SortByProductName.Click
    'Sort by ProductName
    RedirectUser(0, "ProductName")
End Sub
Protected Sub SortByCategoryName_Click(sender As Object, e As EventArgs) _
    Handles SortByCategoryName.Click
    'Sort by CategoryName
    RedirectUser(0, "CategoryName")
End Sub
Protected Sub SortBySupplierName_Click(sender As Object, e As EventArgs) _
    Handles SortBySupplierName.Click
    'Sort by SupplierName
    RedirectUser(0, "SupplierName")
End Sub

Beim ersten Besuch der Seite werden die Daten alphabetisch nach dem Produktnamen sortiert (siehe Abbildung 9). Klicken Sie auf die Schaltfläche Weiter, um zur zweiten Datenseite zu gelangen, und klicken Sie dann auf die Schaltfläche Nach Kategorie sortieren. Dadurch gelangen wir zur ersten Datenseite, sortiert nach Kategoriename (siehe Abbildung 10). Ebenso werden beim Klicken auf die Schaltfläche Nach Lieferanten sortieren die Daten ab der ersten Datenseite nach Lieferanten sortiert. Die Sortierauswahl wird beim Ausblättern der Daten gespeichert. Abbildung 11 zeigt die Seite nach der Sortierung nach Kategorie und dann dem Fortschritt zur dreizehnten Datenseite.

Die Produkte sind nach Kategorie sortiert.

Abbildung 10: Die Produkte sind nach Kategorie sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Der Sortierausdruck wird beim Durchlaufen der Daten gespeichert.

Abbildung 11: Der Sortierausdruck wird beim Durchlaufen der Daten gespeichert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 6: Benutzerdefiniertes Paging durch Datensätze in einem Repeater

Im DataList-Beispiel wurden in Schritt 5 Seiten anhand der Daten mithilfe der ineffizienten Standard-Paging-Technik untersucht. Beim Paging durch ausreichend große Datenmengen muss unbedingt benutzerdefiniertes Paging verwendet werden. Zurück in den Tutorials Effizientes Paging durch große Datenmengen und Sortieren von benutzerdefinierten ausgelagerten Daten haben wir die Unterschiede zwischen Standard- und benutzerdefiniertem Paging und erstellten Methoden in der BLL für die Verwendung von benutzerdefinierten Paging und sortieren benutzerdefinierte Auslagerungsdaten untersucht. Insbesondere in diesen beiden vorherigen Tutorials haben wir der ProductsBLL Klasse die folgenden drei Methoden hinzugefügt:

  • GetProductsPaged(startRowIndex, maximumRows) gibt eine bestimmte Teilmenge von Datensätzen zurück, die bei startRowIndex beginnen und maximumRows nicht überschreiten.
  • GetProductsPagedAndSorted(sortExpression, startRowIndex, maximumRows) gibt eine bestimmte Teilmenge von Datensätzen zurück, die nach dem angegebenen sortExpression-Eingabeparameter sortiert sind.
  • TotalNumberOfProducts() stellt die Gesamtzahl der Datensätze in der Products Datenbanktabelle bereit.

Mit diesen Methoden können Daten mithilfe eines DataList- oder Repeater-Steuerelements effizient ausgelagert und sortiert werden. Um dies zu veranschaulichen, erstellen wir zunächst ein Repeater-Steuerelement mit benutzerdefinierter Pagingunterstützung. Anschließend fügen wir Sortierfunktionen hinzu.

Öffnen Sie die SortingWithCustomPaging.aspx Seite im PagingSortingDataListRepeater Ordner, und fügen Sie der Seite einen Repeater hinzu, und legen Sie die ID -Eigenschaft auf fest Products. Erstellen Sie aus dem Smarttag des Repeaters eine neue ObjectDataSource mit dem Namen ProductsDataSource. Konfigurieren Sie sie, um die zugehörigen Daten aus der ProductsBLL Klasse s-Methode GetProductsPaged auszuwählen.

Konfigurieren der ObjectDataSource für die Verwendung der GetProductsPaged-Methode der ProductsBLL-Klasse

Abbildung 12: Konfigurieren der ObjectDataSource für die Verwendung der ProductsBLL Class s-Methode (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)GetProductsPaged

Legen Sie die Dropdownlisten auf den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest, und klicken Sie dann auf die Schaltfläche Weiter. Der Assistent zum Konfigurieren von Datenquellen fordert jetzt zur Eingabe der Quellen der GetProductsPaged Eingabeparameter s startRowIndex und maximumRows auf. Tatsächlich werden diese Eingabeparameter ignoriert. Stattdessen werden die Werte startRowIndex und maximumRows über die Arguments -Eigenschaft im ObjectDataSource-Ereignishandler Selecting übergeben, genau wie in der ersten Demo dieses Tutorials sortExpression angegeben. Behalten Sie daher die Dropdownlisten für die Parameterquelle im Assistenten bei, die auf Keine festgelegt sind.

Lassen Sie die Parameterquellen auf Keine festgelegt.

Abbildung 13: Lassen Sie die Parameterquellen auf Keine festgelegt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Legen Sie die ObjectDataSource-Eigenschaft EnablePagingnicht auf festtrue. Dies führt dazu, dass objectDataSource automatisch eigene startRowIndex - und maximumRows-Parameter in die vorhandene Parameterliste einschließt SelectMethod . Die EnablePaging -Eigenschaft ist nützlich, wenn benutzerdefinierte ausgelagerte Daten an ein GridView-, DetailsView- oder FormView-Steuerelement gebunden werden, da diese Steuerelemente ein bestimmtes Verhalten von der ObjectDataSource erwarten, das nur verfügbar ist, wenn EnablePaging die Eigenschaft ist true. Da wir die Pagingunterstützung für DataList und Repeater manuell hinzufügen müssen, lassen Sie diese Eigenschaft auf false (Standard) festgelegt, da wir die erforderlichen Funktionen direkt auf der seite ASP.NET einfügen.

Definieren Sie schließlich die Repeater-S ItemTemplate , damit der Name, die Kategorie und der Lieferant des Produkts angezeigt werden. Nach diesen Änderungen sollte die deklarative Syntax von Repeater und ObjectDataSource in etwa wie folgt aussehen:

<asp:Repeater ID="Products" runat="server" DataSourceID="ProductsDataSource"
    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>
</asp:Repeater>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsPaged" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter Name="startRowIndex" Type="Int32" />
        <asp:Parameter Name="maximumRows" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Nehmen Sie sich einen Moment Zeit, um die Seite über einen Browser zu besuchen, und beachten Sie, dass keine Datensätze zurückgegeben werden. Dies liegt daran, dass wir die Parameterwerte startRowIndex und maximumRows noch angeben müssen. Daher werden werte von 0 für beide übergeben. Um diese Werte anzugeben, erstellen Sie einen Ereignishandler für das ObjectDataSource-Ereignis Selecting , und legen Sie diese Parameterwerte programmgesteuert auf hartcodierte Werte von 0 bzw. 5 festcodiert fest:

Protected Sub ProductsDataSource_Selecting(sender As Object, _
    e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    e.InputParameters("startRowIndex") = 0
    e.InputParameters("maximumRows") = 5
End Sub

Mit dieser Änderung zeigt die Seite, wenn sie über einen Browser angezeigt wird, die ersten fünf Produkte an.

Die ersten fünf Datensätze werden angezeigt.

Abbildung 14: Die ersten fünf Datensätze werden angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Die in Abbildung 14 aufgeführten Produkte werden zufällig nach Produktnamen sortiert, da die GetProductsPaged gespeicherte Prozedur, die die effiziente benutzerdefinierte Pagingabfrage ausführt, die Ergebnisse nach ProductNamesortiert.

Damit der Benutzer die Seiten durchlaufen kann, müssen wir den Index der Startzeile und die maximalen Zeilen nachverfolgen und diese Werte über Postbacks hinweg speichern. Im Standardauslagerungsbeispiel haben wir Abfragezeichenfolgenfelder verwendet, um diese Werte beizubehalten. Für diese Demo speichern wir diese Informationen im Ansichtszustand der Seite. Erstellen Sie die folgenden beiden Eigenschaften:

Private Property StartRowIndex() As Integer
    Get
        Dim o As Object = ViewState("StartRowIndex")
        If o Is Nothing Then
            Return 0
        Else
            Return CType(o, Integer)
        End If
    End Get
    Set(ByVal value As Integer)
        ViewState("StartRowIndex") = value
    End Set
End Property
Private Property MaximumRows() As Integer
    Get
        Dim o As Object = ViewState("MaximumRows")
        If o Is Nothing Then
            Return 5
        Else
            Return CType(o, Integer)
        End If
    End Get
    Set(ByVal value As Integer)
        ViewState("MaximumRows") = value
    End Set
End Property

Aktualisieren Sie als Nächstes den Code im Selecting-Ereignishandler, sodass die StartRowIndex Eigenschaften und MaximumRows anstelle der hartcodierten Werte von 0 und 5 verwendet werden:

e.InputParameters("startRowIndex") = 0
e.InputParameters("maximumRows") = 5

An diesem Punkt zeigt unsere Seite noch nur die ersten fünf Datensätze an. Da diese Eigenschaften jedoch vorhanden sind, können wir unsere Pagingschnittstelle erstellen.

Hinzufügen der Pagingschnittstelle

Wir verwenden dieselbe First-, Previous-, Next- und Last-Paging-Schnittstelle, die im Standard paging-Beispiel verwendet wird, einschließlich des Label Web-Steuerelements, das anzeigt, welche Datenseite angezeigt wird und wie viele Seiten insgesamt vorhanden sind. Fügen Sie die vier Schaltflächenwebsteuerelemente und Bezeichnung unterhalb des Repeaters hinzu.

<p>
    <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 >>" />
</p>
<p>
    <asp:Label runat="server" ID="CurrentPageNumber"></asp:Label>
</p>

Erstellen Sie Click als Nächstes Ereignishandler für die vier Schaltflächen. Wenn auf eine dieser Schaltflächen geklickt wird, müssen wir die StartRowIndex aktualisieren und die Daten erneut an den Repeater binden. Der Code für die Schaltflächen First, Previous und Next ist einfach genug, aber wie bestimmen wir für die Schaltfläche Zuletzt den Startzeilenindex für die letzte Datenseite? Um diesen Index zu berechnen und zu bestimmen, ob die Schaltflächen Weiter und Zuletzt aktiviert werden sollen, müssen wir wissen, wie viele Datensätze insgesamt ausgelagert werden. Wir können dies ermitteln, indem wir die s-Methode der ProductsBLL Klasse TotalNumberOfProducts() aufrufen. Erstellen Sie eine schreibgeschützte Eigenschaft auf Seitenebene namens TotalRowCount , die die Ergebnisse der TotalNumberOfProducts() Methode zurückgibt:

Private ReadOnly Property TotalRowCount() As Integer
    Get
        'Return the value from the TotalNumberOfProducts() method
        Dim productsAPI As New ProductsBLL()
        Return productsAPI.TotalNumberOfProducts()
    End Get
End Property

Mit dieser Eigenschaft können wir jetzt den Startzeilenindex der letzten Seite ermitteln. Insbesondere ist es das ganzzahlige Ergebnis von TotalRowCount minus 1 dividiert durch MaximumRows, multipliziert mit MaximumRows. Wir können jetzt die Click Ereignishandler für die vier Schaltflächen der Pagingschnittstelle schreiben:

Protected Sub FirstPage_Click(sender As Object, e As EventArgs) _
    Handles FirstPage.Click
    'Return to StartRowIndex of 0 and rebind data
    StartRowIndex = 0
    Products.DataBind()
End Sub
Protected Sub PrevPage_Click(sender As Object, e As EventArgs) _
    Handles PrevPage.Click
    'Subtract MaximumRows from StartRowIndex and rebind data
    StartRowIndex -= MaximumRows
    Products.DataBind()
End Sub
Protected Sub NextPage_Click(sender As Object, e As EventArgs) _
    Handles NextPage.Click
    'Add MaximumRows to StartRowIndex and rebind data
    StartRowIndex += MaximumRows
    Products.DataBind()
End Sub
Protected Sub LastPage_Click(sender As Object, e As EventArgs) _
    Handles LastPage.Click
    'Set StartRowIndex = to last page's starting row index and rebind data
    StartRowIndex = ((TotalRowCount - 1) \ MaximumRows) * MaximumRows
    Products.DataBind()
End Sub

Schließlich müssen wir die Schaltflächen First und Previous in der Paging-Benutzeroberfläche deaktivieren, wenn die erste Seite der Daten angezeigt wird, und die Schaltflächen Weiter und Zuletzt beim Anzeigen der letzten Seite. Fügen Sie dazu dem ObjectDataSource-Ereignishandler Selecting den folgenden Code hinzu:

' Disable the paging interface buttons, if needed
FirstPage.Enabled = StartRowIndex <> 0
PrevPage.Enabled = StartRowIndex <> 0
Dim LastPageStartRowIndex As Integer = _
    ((TotalRowCount - 1) \ MaximumRows) * MaximumRows
NextPage.Enabled = (StartRowIndex < LastPageStartRowIndex)
LastPage.Enabled = (StartRowIndex < LastPageStartRowIndex)

Nachdem Sie diese Click Ereignishandler und den Code zum Aktivieren oder Deaktivieren der Elemente der Pagingschnittstelle basierend auf dem aktuellen Startzeilenindex hinzugefügt haben, testen Sie die Seite in einem Browser. Wie abbildung 15 veranschaulicht, werden beim ersten Besuch der Seite die Schaltflächen First und Previous deaktiviert. Wenn Sie auf Weiter klicken, wird die zweite Seite der Daten angezeigt, während sie auf Letzte klicken, die letzte Seite anzeigt (siehe Abbildungen 16 und 17). Beim Anzeigen der letzten Datenseite sind sowohl die Schaltflächen Weiter als auch Zuletzt deaktiviert.

Die Schaltflächen

Abbildung 15: Die Schaltflächen "Zurück" und "Zuletzt" sind beim Anzeigen der ersten Produktseite deaktiviert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Die zweite Seite der Produkte wird angezeigt

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

Wenn Sie auf Zuletzt klicken, wird die letzte Seite der Daten angezeigt.

Abbildung 17: Klicken auf Zuletzt zeigt die letzte Seite der Daten an (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 7: Einschließlich der Sortierunterstützung mit dem benutzerdefinierten Auslagerungswiederholer

Nachdem das benutzerdefinierte Paging implementiert wurde, sind wir bereit, die Sortierunterstützung einzuschließen. Die ProductsBLL Methode der Klasse s GetProductsPagedAndSorted verfügt über die gleichen StartRowIndex - und maximumRows-Eingabeparameter wie GetProductsPaged, lässt jedoch einen zusätzlichen sortExpression-Eingabeparameter zu. Um die GetProductsPagedAndSorted -Methode von SortingWithCustomPaging.aspxverwenden zu können, müssen wir die folgenden Schritte ausführen:

  1. Ändern Sie die ObjectDataSource-Eigenschaft SelectMethod von in GetProductsPagedGetProductsPagedAndSorted.
  2. Fügen Sie der ObjectDataSource-Auflistung SelectParameters ein sortExpression-ObjektParameter hinzu.
  3. Erstellen Sie eine private Eigenschaft auf Seitenebene SortExpression , die ihren Wert über Postbacks über den Ansichtszustand der Seite hinweg beibehält.
  4. Aktualisieren Sie den ObjectDataSource-Ereignishandler, Selecting um dem ObjectDataSource-Parameter sortExpression den Wert der Eigenschaft auf Seitenebene SortExpression zuzuweisen.
  5. Erstellen Sie die Sortierschnittstelle.

Aktualisieren Sie zunächst die ObjectDataSource-Eigenschaft, SelectMethod und fügen Sie eine sortExpressionParameter hinzu. Stellen Sie sicher, dass die sortExpression-EigenschaftParameterType auf Stringfestgelegt ist. Nach Abschluss dieser ersten beiden Aufgaben sollte das deklarative Markup des ObjectDataSource-Objekts wie folgt aussehen:

<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsPagedAndSorted"
    OnSelecting="ProductsDataSource_Selecting">
    <SelectParameters>
        <asp:Parameter Name="sortExpression" Type="String" />
        <asp:Parameter Name="startRowIndex" Type="Int32" />
        <asp:Parameter Name="maximumRows" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Als Nächstes benötigen wir eine Eigenschaft auf Seitenebene SortExpression , deren Wert serialisiert wird, um den Zustand anzuzeigen. Wenn kein Sortierausdruckswert festgelegt wurde, verwenden Sie ProductName als Standard:

Private Property SortExpression() As String
    Get
        Dim o As Object = ViewState("SortExpression")
        If o Is Nothing Then
            Return "ProductName"
        Else
            Return o.ToString()
        End If
    End Get
    Set(ByVal value As String)
        ViewState("SortExpression") = value
    End Set
End Property

Bevor ObjectDataSource die GetProductsPagedAndSorted -Methode aufruft, müssen wir sortExpressionParameter auf den Wert der SortExpression -Eigenschaft festlegen. Fügen Sie im Selecting Ereignishandler die folgende Codezeile hinzu:

e.InputParameters("sortExpression") = SortExpression

Es bleibt nur noch die Implementierung der Sortierschnittstelle. Wie im letzten Beispiel wird die Sortierschnittstelle mithilfe von drei Button Web-Steuerelementen implementiert, die es dem Benutzer ermöglichen, die Ergebnisse nach Produktname, Kategorie oder Lieferant zu sortieren.

<asp:Button runat="server" id="SortByProductName"
    Text="Sort by Product Name" />
<asp:Button runat="server" id="SortByCategoryName"
    Text="Sort by Category" />
<asp:Button runat="server" id="SortBySupplierName"
    Text="Sort by Supplier" />

Erstellen Sie Click Ereignishandler für diese drei Button-Steuerelemente. Setzen Sie im Ereignishandler auf StartRowIndex 0 zurück, legen Sie auf SortExpression den entsprechenden Wert fest, und binden Sie die Daten erneut an den Repeater:

Protected Sub SortByProductName_Click(sender As Object, e As EventArgs) _
    Handles SortByProductName.Click
    StartRowIndex = 0
    SortExpression = "ProductName"
    Products.DataBind()
End Sub
Protected Sub SortByCategoryName_Click(sender As Object, e As EventArgs) _
    Handles SortByCategoryName.Click
    StartRowIndex = 0
    SortExpression = "CategoryName"
    Products.DataBind()
End Sub
Protected Sub SortBySupplierName_Click(sender As Object, e As EventArgs) _
    Handles SortBySupplierName.Click
    StartRowIndex = 0
    SortExpression = "CompanyName"
    Products.DataBind()
End Sub

Das ist alles, was es gibt! Obwohl es eine Reihe von Schritten gab, um benutzerdefiniertes Paging und Sortierung implementiert zu bekommen, waren die Schritte denen für standard paging sehr ähnlich. Abbildung 18 zeigt die Produkte beim Anzeigen der letzten Datenseite nach Kategorie.

Die letzte Seite der Daten, sortiert nach Kategorie, wird angezeigt.

Abbildung 18: Die letzte Seite der Daten, sortiert nach Kategorie, wird angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

In früheren Beispielen wurde beim Sortieren nach dem Lieferanten SupplierName als Sortierausdruck verwendet. Für die benutzerdefinierte Pagingimplementierung müssen wir jedoch CompanyName verwenden. Dies liegt daran, dass die gespeicherte Prozedur, die für die Implementierung des benutzerdefinierten Pagings GetProductsPagedAndSorted zuständig ist, den Sortierausdruck an die ROW_NUMBER() Schlüsselwort (keyword) übergibt. Die ROW_NUMBER() Schlüsselwort (keyword) erfordert den tatsächlichen Spaltennamen und nicht einen Alias. Daher müssen wir (den Namen der Spalte in der Suppliers Tabelle) anstelle des Alias verwenden CompanyName , der in der SELECT Abfrage (SupplierName) für den Sortierausdruck verwendet wird.

Zusammenfassung

Weder dataList noch Repeater bieten integrierte Sortierunterstützung, aber mit etwas Code und einer benutzerdefinierten Sortierschnittstelle können solche Funktionen hinzugefügt werden. Beim Implementieren von Sortierung, aber nicht paging, kann der Sortierausdruck über das Objekt angegeben werden, das DataSourceSelectArguments an die ObjectDataSource-Methode Select übergeben wird. Diese DataSourceSelectArguments Objekt-s-Eigenschaft SortExpression kann im ObjectDataSource-Ereignishandler Selecting zugewiesen werden.

Um einer DataList oder einem Repeater, der bereits Paging unterstützt, Sortierfunktionen hinzuzufügen, besteht der einfachste Ansatz darin, die Geschäftslogikebene so anzupassen, dass eine Methode enthalten ist, die einen Sortierausdruck akzeptiert. Diese Informationen können dann über einen Parameter in objectDataSource übergeben SelectParameterswerden.

In diesem Tutorial wird die Untersuchung des Pagings und sortierens mit den DataList- und Repeater-Steuerelementen abgeschlossen. In unserem nächsten und letzten Tutorial wird untersucht, wie Button-Websteuerelemente zu den Vorlagen DataList und Repeater hinzugefügt werden, um benutzerdefinierte, vom Benutzer initiierte Funktionen auf Elementbasis bereitzustellen.

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 Hours. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.

Besonderer Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Leitender Prüfer für dieses Tutorial war David Suru. Möchten Sie meine bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.