Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Scott Mitchell
In diesem Lernprogramm untersuchen wir, wie Sie die Sortierunterstützung in dataList und Repeater einschließen und wie Sie eine Datenliste oder einen Repeater erstellen, deren Daten ausgelagert und sortiert werden können.
Einführung
Im vorherigen Lernprogramm haben wir untersucht, wie eine Pagingunterstützung zu einer DataList hinzugefügt wird. Wir haben eine neue Methode in der Klasse (ProductsBLL
) erstellt, die GetProductsAsPagedDataSource
ein PagedDataSource
Objekt zurückgegeben hat. Wenn sie an eine DataList oder einen Repeater gebunden sind, würde die DataList oder der Repeater nur die angeforderte Seite mit Daten anzeigen. Diese Technik ähnelt dem, was intern von den GridView-, DetailsView- und FormView-Steuerelementen verwendet wird, um ihre integrierte Standard paging-Funktionalität bereitzustellen.
Zusätzlich zur Unterstützung der Seitenverwaltung umfasst gridView auch out of the box sortierunterstützung. Weder die DataList noch der Repeater bieten integrierte Sortierfunktionen; Sortierfeatures können jedoch mit etwas Code hinzugefügt werden. In diesem Lernprogramm untersuchen wir, wie Sie die Sortierunterstützung in dataList und Repeater einschließen und wie Sie eine Datenliste oder einen Repeater erstellen, deren Daten ausgelagert und sortiert werden können.
Eine Überprüfung der Sortierung
Wie wir im Lernprogramm „Berichte zu Paging und Sortierung“ gesehen haben, bietet das GridView-Steuerelement integrierte Unterstützung für das Sortieren. Jedes GridView-Feld kann ein zugeordnetes Feld aufweisen SortExpression
, das das Datenfeld angibt, nach dem die Daten sortiert werden sollen. Wenn die GridView-Eigenschaft AllowSorting
auf true
"GridView" festgelegt ist, wird jedes GridView-Feld mit einem SortExpression
Eigenschaftswert als LinkButton gerendert. Wenn ein Benutzer auf die Kopfzeile eines bestimmten GridView-Felds klickt, tritt ein Postback auf, und die Daten werden entsprechend den geklickten Feldern SortExpression
sortiert.
Das GridView-Steuerelement verfügt auch über eine SortExpression
Eigenschaft, die das SortExpression
GridView-Feld 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 eine bestimmte Kopfzeile des GridView-Felds klickt, wird die Sortierreihenfolge umgeschaltet).
Wenn das GridView-Steuerelement an das Datenquellensteuerelement gebunden ist, übergibt es seine SortExpression
Eigenschaften und SortDirection
Eigenschaften an das Datenquellensteuerelement. Das Datenquellensteuerelement ruft die Daten ab und sortiert sie dann nach den bereitgestellten SortExpression
eigenschaften SortDirection
. Nach dem Sortieren der Daten gibt das Datenquellensteuerelement sie an die GridView zurück.
Um diese Funktionalität mit den DataList- oder Repeater-Steuerelementen zu replizieren, müssen wir Folgendes ausführen:
- Erstellen einer Sortierschnittstelle
- Denken Sie daran, dass das Zu sortierende Datenfeld nach 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. Danach untersuchen wir, wie Sie sowohl die Paging- als auch die Sortierunterstützung in eine DataList oder einen Repeater einschließen.
Schritt 2: Anzeigen der Produkte in einem Repeater
Bevor wir uns gedanken über die Implementierung einer der sortierbezogenen Funktionen machen, beginnen wir damit, die Produkte in einem Repeater-Steuerelement aufzulisten. Ö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 SortableProducts
. Erstellen Sie aus dem Smarttag "Repeater" eine neue ObjectDataSource namens ProductsDataSource
, und konfigurieren Sie sie, um Daten aus der ProductsBLL
Klassenmethode GetProducts()
abzurufen. Wählen Sie die Option (Keine) aus den Dropdownlisten in den Registerkarten EINFÜGEN, AKTUALISIEREN und LÖSCHEN aus.
Abbildung 1: Erstellen einer ObjectDataSource und Konfigurieren einer Methode für die Verwendung der GetProductsAsPagedDataSource()
Methode (Klicken, um das Bild in voller Größe anzuzeigen)
Abbildung 2: Festlegen der Drop-Down Listen in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) (Klicken, um das Bild in voller Größe anzuzeigen)
Anders als bei der DataList erstellt Visual Studio nach dem Binden an eine Datenquelle nicht automatisch ein ItemTemplate
Steuerelement für den Repeater. Darüber hinaus müssen wir dies ItemTemplate
deklarativ hinzufügen, da das Smarttag des Repeater-Steuerelements die Option "Vorlagen bearbeiten" fehlt, die in den DataList s gefunden wurde. Lassen Sie uns dasselbe ItemTemplate
aus dem vorherigen Lernprogramm verwenden, in dem der Name, der Lieferant und die Kategorie des Produkts angezeigt werden.
Nach dem ItemTemplate
Hinzufügen sollte das deklarative Markup von Repeater und ObjectDataSource ähnlich 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.
Abbildung 3: Jeder Produktname, Jeder Lieferant und jede Kategorie wird angezeigt (Zum Anzeigen des Bilds mit voller Größe klicken)
Schritt 3: Anweisen der ObjectDataSource zum Sortieren der Daten
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 objectDataSource seine Daten abruft, löst sie zuerst das Selecting
Ereignis aus, das uns die Möglichkeit bietet, einen Sortierausdruck anzugeben. Der Selecting
Ereignishandler wird ein Objekt vom Typ ObjectDataSourceSelectingEventArgs
übergeben, das eine Eigenschaft mit dem Namen Arguments
des Typs DataSourceSelectArguments
hat. Die DataSourceSelectArguments
Klasse wurde entwickelt, um datenbezogene Anforderungen von einem Verbraucher von Daten an das Datenquellensteuerelement zu übergeben und enthält eine SortExpression
Eigenschaft.
Um Sortierinformationen von der ASP.NET Seite an objectDataSource zu übergeben, erstellen Sie einen Ereignishandler für das Selecting
Ereignis, und verwenden Sie den folgenden Code:
protected void ProductsDataSource_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.Arguments.SortExpression = sortExpression;
}
Dem SortExpression-Wert sollte der Name des Datenfelds zugewiesen werden, nach dem die Daten sortiert werden sollen (z. B. ProductName). Es gibt keine sortierrichtungsbezogene Eigenschaft. 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).
Fahren Sie fort, und probieren Sie verschiedene hartcodierte Werte für sortExpression aus, und testen Sie die Ergebnisse in einem Browser. Wie in Abbildung 4 dargestellt, werden die Produkte bei Verwendung von ProductName DESC als SortExpression 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, werden die Kopfzeilentext jedes sortierbaren Felds in ein LinkButton-Objekt konvertiert, das die Daten beim Klicken entsprechend sortiert. Eine solche Sortierschnittstelle ist für die GridView sinnvoll, in der ihre Daten in Spalten übersichtlich angeordnet sind. Für die DataList- und Repeater-Steuerelemente ist jedoch eine andere Sortierschnittstelle erforderlich. Eine allgemeine 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 Lernprogramm implementieren.
Fügen Sie ein DropDownList-Websteuerelement über dem SortableProducts
Repeater hinzu, und legen Sie dessen ID
Eigenschaft auf SortBy
. Klicken Sie im Eigenschaftenfenster auf die Auslassungspunkte in der Items
Eigenschaft, um den ListItem-Auflistungs-Editor anzuzeigen. Fügen Sie ListItem
s hinzu, um die Daten nach den ProductName
CategoryName
Feldern und SupplierName
Feldern zu sortieren. Fügen Sie außerdem ein ListItem
, um die Produkte nach ihrem Namen in umgekehrter alphabetischer Reihenfolge zu sortieren.
Die ListItem
Text
Eigenschaften können auf einen beliebigen Wert (z. B. Name) festgelegt werden, aber die Value
Eigenschaften müssen auf den Namen des Datenfelds (z. B. ProductName) festgelegt werden. Um die Ergebnisse in absteigender Reihenfolge zu sortieren, fügen Sie die Zeichenfolge DESC an den Namen des Datenfelds an, z. B. ProductName DESC.
Abbildung 5: Fügen Sie ein ListItem
für jedes der sortierbaren Datenfelder hinzu
Fügen Sie schließlich rechts neben der DropDownList ein Button-Websteuerelement hinzu. Legen Sie deren ID
Eigenschaft auf RefreshRepeater
"Refresh" fest.Text
Nachdem Sie die ListItem
Schaltfläche "s" erstellt und die Schaltfläche "Aktualisieren" hinzugefügt haben, sollte die deklarative Syntax "DropDownList" und "Button" ähnlich 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" />
Nach Abschluss der Sortierung von DropDownList müssen wir den ObjectDataSource-Ereignishandler Selecting
aktualisieren, sodass die ausgewählte SortBy``ListItem
Eigenschaft Value
im Gegensatz zu einem hartcodierten Sortierausdruck verwendet wird.
protected void ProductsDataSource_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
// Have the ObjectDataSource sort the results by the selected
// sort expression
e.Arguments.SortExpression = SortBy.SelectedValue;
}
An diesem Punkt beim ersten Besuch der Seite werden die Produkte zunächst nach dem ProductName
Datenfeld sortiert, da sie standardmäßig ausgewählt ist SortBy
ListItem
(siehe Abbildung 6). Wenn Sie eine andere Sortieroption wie "Kategorie" auswählen und auf "Aktualisieren" klicken, wird ein Postback verursacht und die Daten nach dem Kategorienamen neu sortiert, wie in Abbildung 7 dargestellt.
Abbildung 6: Die Produkte werden anfangs nach ihrem Namen sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 7: Die Produkte sind jetzt nach Kategorie sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Hinweis
Wenn Sie auf die Schaltfläche "Aktualisieren" klicken, werden die Daten automatisch neu sortiert, da der Ansichtszustand des Repeaters deaktiviert wurde, wodurch der Repeater bei jedem Postback erneut an die Datenquelle gebunden wird. 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 s Click
-Ereignis und binden den Repeater an seine Datenquelle (durch Aufrufen der Repeater-Methode DataBind()
).
Speichern des Sortierausdrucks und der Sortierrichtung
Beim Erstellen einer sortierbaren DataList oder Repeater auf einer Seite, auf der nicht sortierbare Postbacks auftreten können, ist es zwingend erforderlich, dass der Sortierausdruck und die Richtung über Postbacks hinweg gespeichert werden. Stellen Sie sich beispielsweise vor, dass wir den Repeater in diesem Lernprogramm aktualisiert haben, um eine Schaltfläche "Löschen" mit jedem Produkt 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 postback hinweg beibehalten werden, werden die auf dem Bildschirm angezeigten Daten auf die ursprüngliche Sortierreihenfolge zurückgesetzt.
In diesem Lernprogramm speichert dropDownList implizit den Sortierausdruck und die Richtung in seinem Ansichtszustand für uns. Wenn wir eine andere Sortierschnittstelle verwenden, z. B. LinkButtons, die die verschiedenen Sortieroptionen bereitgestellt haben, müssen wir uns kümmern, um die Sortierreihenfolge über Postbacks hinweg zu merken. Dies kann erreicht werden, indem die Sortierparameter im Ansichtszustand der Seite gespeichert werden, indem der Sortierparameter in die Abfragezeichenfolge oder durch eine andere Zustandspersistenztechnik eingeschlossen wird.
In zukünftigen Beispielen in diesem Lernprogramm erfahren Sie, wie Sie die Sortierdetails im Ansichtszustand der Seite beibehalten.
Schritt 5: Hinzufügen der Sortierunterstützung zu einer DataList, die standardmäßiges Paging verwendet
Im vorherigen Lernprogramm haben wir untersucht, wie die Standardpaginierung mit einer DataList implementiert wird. Lassen Sie uns dieses vorherige Beispiel erweitern, um die Möglichkeit zum Sortieren der seitenseitigen Daten einzuschließen. Öffnen Sie zunächst die Seiten und die SortingWithDefaultPaging.aspx
Seiten 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 zwischen SortingWithDefaultPaging.aspx
den <asp:Content>
Tags ein.
Abbildung 8: Replizieren des deklarativen Markups in den <asp:Content>
Tags von Paging.aspx
in SortingWithDefaultPaging.aspx
(Klicken, 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 einen Moment 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 Standard-Paging- und Sortiermethode einzuschließen
Im vorherigen Lernprogramm 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 (über die BLL-Methode GetProducts()
) aufgefüllt, aber wenn es an die DataList gebunden ist, wurden nur die Datensätze angezeigt, die den angegebenen pageIndex - und pageSize-Eingabeparametern entsprechen.
Weiter oben in diesem Lernprogramm haben wir die Sortierunterstützung hinzugefügt, indem wir den Sortierausdruck aus dem ObjectDataSource-Ereignishandler Selecting
angeben. Dies funktioniert gut, wenn die ObjectDataSource ein Objekt zurückgibt, das sortiert werden kann, z. B. die ProductsDataTable
von der GetProducts()
Methode zurückgegebene.
PagedDataSource
Das von der GetProductsAsPagedDataSource
Methode zurückgegebene Objekt unterstützt jedoch keine Sortierung der inneren Datenquelle. Stattdessen müssen wir die von der GetProducts()
Methode zurückgegebenen Ergebnisse sortieren, bevor wir sie in die PagedDataSource
Datei einfügen.
Erstellen Sie dazu eine neue Methode in der ProductsBLL
Klasse. GetProductsSortedAsPagedDataSource(sortExpression, pageIndex, pageSize)
Um die ProductsDataTable
von der GetProducts()
Methode zurückgegebene Sortierung zu sortieren, geben Sie die Sort
Eigenschaft des Standardwerts DataTableView
an:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public PagedDataSource GetProductsSortedAsPagedDataSource
(string sortExpression, int pageIndex, int pageSize)
{
// Get ALL of the products
Northwind.ProductsDataTable products = GetProducts();
// Sort the products
products.DefaultView.Sort = sortExpression;
// Limit the results through a PagedDataSource
PagedDataSource pagedData = new PagedDataSource();
pagedData.DataSource = products.DefaultView;
pagedData.AllowPaging = true;
pagedData.CurrentPageIndex = pageIndex;
pagedData.PageSize = pageSize;
return pagedData;
}
Die GetProductsSortedAsPagedDataSource
Methode unterscheidet sich nur geringfügig von der GetProductsAsPagedDataSource
im vorherigen Lernprogramm erstellten Methode. Nimmt insbesondere GetProductsSortedAsPagedDataSource
einen zusätzlichen Eingabeparameter sortExpression
an und weist diesen Wert der Sort
Eigenschaft der ProductDataTable
s DefaultView
zu. Ein paar Codezeilen später wird die DataSource des PagedDataSource
Objekts den ProductDataTable
S DefaultView
zugewiesen.
Aufrufen der GetProductsSortedAsPagedDataSource-Methode und Angeben des Werts für den SortExpression-Eingabeparameter
Nachdem die GetProductsSortedAsPagedDataSource
Methode abgeschlossen ist, besteht der nächste Schritt darin, den Wert für diesen Parameter bereitzustellen. Die ObjectDataSource in SortingWithDefaultPaging.aspx
ist zurzeit so konfiguriert, dass die GetProductsAsPagedDataSource
Methode aufgerufen wird und die beiden Eingabeparameter über die beiden QueryStringParameters
Eingabeparameter übergeben werden, die in der SelectParameters
Auflistung angegeben sind. Diese beiden QueryStringParameters
geben an, dass die Quelle für die GetProductsAsPagedDataSource
Methode die Parameter "pageIndex" und "pageSize" aus den Abfragezeichenfolgenfeldern pageIndex
und pageSize
stammen.
Aktualisieren Sie die ObjectDataSource-Eigenschaft SelectMethod
so, dass sie die neue GetProductsSortedAsPagedDataSource
Methode aufruft. Fügen Sie dann ein neues QueryStringParameter
hinzu, sodass auf den Eingabeparameter "sortExpression " über das Abfragezeichenfolgenfeld sortExpression
zugegriffen wird. Legen Sie " 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 Seite die SortingWithDefaultPaging.aspx
Ergebnisse alphabetisch nach dem Produktnamen (siehe Abbildung 9). Dies liegt daran, dass standardmäßig ein Wert von ProductName als GetProductsSortedAsPagedDataSource
der Methode übergeben wird.
Abbildung 9: Standardmäßig werden die Ergebnisse nach ProductName
sortiert (Klicken zum Anzeigen des Bildes in voller Größe)
Wenn Sie manuell ein sortExpression
Abfragezeichenfolgenfeld wie SortingWithDefaultPaging.aspx?sortExpression=CategoryName
die Ergebnisse hinzufügen, wird nach dem angegebenen sortExpression
sortiert. Dieser sortExpression
Parameter ist jedoch nicht in der Abfragezeichenfolge enthalten, wenn er zu einer anderen Datenseite wechselt. Tatsächlich bringt uns das Klicken auf die Schaltflächen "Weiter" oder "Letzte Seite" zurück zu Paging.aspx
! Darüber hinaus gibt es derzeit keine Sortierschnittstelle. Die einzige Möglichkeit, wie ein Benutzer die Sortierreihenfolge der seitenseitigen Daten ändern kann, besteht darin, die Abfragezeichenfolge direkt zu bearbeiten.
Erstellen der Sortierschnittstelle
Zunächst müssen wir die RedirectUser
Methode aktualisieren, um den Benutzer an (anstelle von SortingWithDefaultPaging.aspx
) zu Paging.aspx
senden und den sortExpression
Wert in die Abfragezeichenfolge einzuschließen. Außerdem sollten wir eine schreibgeschützte benannte SortExpression
Eigenschaft auf Seitenebene hinzufügen. Diese Eigenschaft, ähnlich wie die eigenschaftenPageIndex
, die PageSize
im vorherigen Lernprogramm erstellt wurden, gibt den Wert des sortExpression
Abfragezeichenfolgenfelds zurück, sofern vorhanden, und der Standardwert ( ProductName ) andernfalls.
Derzeit akzeptiert die RedirectUser
Methode nur einen einzelnen Eingabeparameter, den der Index der anzuzeigenden Seite annimmt. Es kann jedoch vorkommen, dass wir den Benutzer mithilfe eines anderen Sortierausdrucks als dem, der in der Abfragezeichenfolge angegeben ist, an eine bestimmte Datenseite umleiten möchten. In einem Moment erstellen wir die Sortierschnittstelle für diese Seite, die eine Reihe von Schaltflächenwebsteuerelementen 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 Sortierausdruckwert übergibt. Erstellen Sie zwei Versionen der RedirectUser
Methode, um diese Funktionalität bereitzustellen. Der erste sollte nur den anzuzeigenden Seitenindex akzeptieren, während die zweite den Seitenindex und den Sortierausdruck akzeptiert.
private string SortExpression
{
get
{
if (!string.IsNullOrEmpty(Request.QueryString["sortExpression"]))
return Request.QueryString["sortExpression"];
else
return "ProductName";
}
}
private void RedirectUser(int sendUserToPageIndex)
{
// Use the SortExpression property to get the sort expression
// from the querystring
RedirectUser(sendUserToPageIndex, SortExpression);
}
private void RedirectUser(int sendUserToPageIndex, string sendUserSortingBy)
{
// 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));
}
Im ersten Beispiel in diesem Lernprogramm haben wir eine Sortierschnittstelle mithilfe einer DropDownList erstellt. Lassen Sie uns in diesem Beispiel drei Schaltflächenwebsteuerelemente verwenden, die über der DataList eins positioniert sind, um nach ProductName
, eins für CategoryName
und eine für SupplierName
. Fügen Sie die drei Schaltflächenwebsteuerelemente hinzu, und legen Sie deren ID
Eigenschaften 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 einen Click
Ereignishandler für jeden. Die Ereignishandler sollten die RedirectUser
Methode aufrufen und den Benutzer mithilfe des entsprechenden Sortierausdrucks an die erste Seite zurückgeben.
protected void SortByProductName_Click(object sender, EventArgs e)
{
// Sort by ProductName
RedirectUser(0, "ProductName");
}
protected void SortByCategoryName_Click(object sender, EventArgs e)
{
// Sort by CategoryName
RedirectUser(0, "CategoryName");
}
protected void SortBySupplierName_Click(object sender, EventArgs e)
{
// Sort by SupplierName
RedirectUser(0, "SupplierName");
}
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 Seite der Daten zu wechseln, und klicken Sie dann auf die Schaltfläche "Nach Kategorie sortieren". Dies gibt uns zur ersten Seite der Daten zurück, sortiert nach Kategoriename (siehe Abbildung 10). Ebenso sortiert das Klicken auf die Schaltfläche "Nach Lieferanten sortieren" die Daten nach Lieferanten beginnend auf der ersten Seite der Daten. Die Sortierauswahl wird gespeichert, da die Daten durchsucht werden. Abbildung 11 zeigt die Seite nach der Sortierung nach Kategorie und gelangen dann zur dreizehnten Datenseite.
Abbildung 10: Die Produkte sind nach Kategorie sortiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 11: Der Sortierausdruck wird beim Ausblättern durch die Daten gespeichert (Klicken, um das Bild in voller Größe anzuzeigen)
Schritt 6: Benutzerdefiniertes Paging durch Datensätze in einem Repeater
Das DataList-Beispiel, das in Schritt 5 Seiten untersucht wurde, durch seine Daten mithilfe der ineffizienten Standard paging-Technik. Bei der Auslagerung über ausreichend große Datenmengen ist es zwingend erforderlich, dass benutzerdefinierte Paging verwendet wird. Zurück in den Lernprogrammen " Effizientes Paging durch große Datenmengen " und " Sortieren von benutzerdefinierten Seitendaten " haben wir die Unterschiede zwischen Standard- und benutzerdefiniertem Paging untersucht und Methoden in der BLL für die Verwendung von benutzerdefinierten Paging- und Sortierung benutzerdefinierter Seitendaten untersucht. Insbesondere haben wir in diesen beiden vorherigen Lernprogrammen die folgenden drei Methoden zur ProductsBLL
Klasse hinzugefügt:
-
GetProductsPaged(startRowIndex, maximumRows)
gibt eine bestimmte Teilmenge von Datensätzen zurück, beginnend bei startRowIndex und nicht mehr als maximumRows. -
GetProductsPagedAndSorted(sortExpression, startRowIndex, maximumRows)
gibt eine bestimmte Teilmenge von Datensätzen zurück, die nach dem angegebenen SortExpression-Eingabeparameter sortiert sind. -
TotalNumberOfProducts()
stellt die Gesamtanzahl der Datensätze in derProducts
Datenbanktabelle bereit.
Diese Methoden können verwendet werden, um Daten mithilfe eines DataList- oder Repeater-Steuerelements effizient zu sortieren und zu sortieren. Um dies zu veranschaulichen, erstellen wir zunächst ein Repeater-Steuerelement mit benutzerdefinierter Paging-Unterstü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 dessen ID
Eigenschaft auf Products
. Erstellen Sie aus dem Smarttag "Repeater" eine neue ObjectDataSource mit dem Namen ProductsDataSource
. Konfigurieren Sie sie, um die Daten aus der ProductsBLL
Klassenmethode GetProductsPaged
auszuwählen.
Abbildung 12: Konfigurieren der ObjectDataSource für die Verwendung der ProductsBLL
Klassenmethode GetProductsPaged
(Klicken, um das Bild in voller Größe anzuzeigen)
Legen Sie die Dropdownlisten in 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 die Quellen für die Eingabeparameter GetProductsPaged
'startRowIndex' und 'maximumRows' der Methode an. Tatsächlich werden diese Eingabeparameter ignoriert. Stattdessen werden die Werte "startRowIndex " und "maximumRows " über die Arguments
Eigenschaft im ObjectDataSource-Ereignishandler Selecting
übergeben, genau wie die SortExpression in der ersten Demo dieses Lernprogramms angegeben wurde. Lassen Sie daher die Dropdownlisten der Parameterquelle im Assistenten auf "None" 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 nicht auf EnablePaging
true
. Dies bewirkt, dass ObjectDataSource automatisch seine eigenen startRowIndex - und maximumRows-Parameter in die SelectMethod
vorhandene Parameterliste einschließt. Die EnablePaging
Eigenschaft ist nützlich, wenn benutzerdefinierte Seitendaten an ein GridView-, DetailsView- oder FormView-Steuerelement gebunden werden, da diese Steuerelemente ein bestimmtes Verhalten von 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 (Standardeinstellung) festgelegt false
, da wir die erforderlichen Funktionen direkt auf unserer ASP.NET Seite backen.
Definieren Sie schließlich die Repeater ItemTemplate
so, dass der Name, die Kategorie und der Lieferant des Produkts angezeigt werden. Nach diesen Änderungen sollte die deklarative Syntax von Repeater und ObjectDataSource ähnlich 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 noch die parameterwerte startRowIndex und maximumRows 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 fest:
protected void ProductsDataSource_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["startRowIndex"] = 0;
e.InputParameters["maximumRows"] = 5;
}
Bei dieser Änderung zeigt die Seite, wenn sie in einem Browser angezeigt wird, die ersten fünf Produkte an.
Abbildung 14: Die ersten fünf Datensätze werden angezeigt (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Hinweis
Die in Abbildung 14 aufgeführten Produkte werden nach Produktname sortiert, da die gespeicherte Prozedur, die GetProductsPaged
die effiziente benutzerdefinierte Pagingabfrage durchführt, die Ergebnisse sortiert nach ProductName
.
Damit der Benutzer die Seiten durchgehen kann, müssen wir den Index der Ersten Zeile und die maximalen Zeilen nachverfolgen und diese Werte über Postbacks hinweg speichern. Im Standardauslagerungsbeispiel haben wir Abfragezeichenfolgenfelder verwendet, um diese Werte beizubehalten. lassen Sie uns diese Informationen für diese Demo im Ansichtszustand der Seite beibehalten. Erstellen Sie die folgenden beiden Eigenschaften:
private int StartRowIndex
{
get
{
object o = ViewState["StartRowIndex"];
if (o == null)
return 0;
else
return (int)o;
}
set
{
ViewState["StartRowIndex"] = value;
}
}
private int MaximumRows
{
get
{
object o = ViewState["MaximumRows"];
if (o == null)
return 5;
else
return (int)o;
}
set
{
ViewState["MaximumRows"] = value;
}
}
Aktualisieren Sie als Nächstes den Code im Auswahlereignishandler so, dass anstelle der hartcodierten Werte von 0 und 5 die StartRowIndex
Eigenschaften verwendet MaximumRows
werden:
e.InputParameters["startRowIndex"] = StartRowIndex;
e.InputParameters["maximumRows"] = MaximumRows;
An diesem Punkt zeigt unsere Seite immer noch nur die ersten fünf Datensätze an. Mit diesen Eigenschaften sind wir jedoch bereit, unsere Paging-Schnittstelle zu erstellen.
Hinzufügen der Pagingschnittstelle
Verwenden wir die gleiche Schnittstelle "First", "Previous", "Next", "Last paging", die im Standard paging-Beispiel verwendet wird, einschließlich des Bezeichnungswebsteuerelements, das anzeigt, welche Datenseite angezeigt wird und wie viele Seiten insgesamt vorhanden sind. Fügen Sie die vier Schaltflächen-Websteuerelemente und die Beschriftung 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
Daten mit dem Repeater aktualisieren und neu verknüpfen. Der Code für die Schaltflächen "First", "Previous" und "Next" ist einfach genug, aber für die Schaltfläche "Zuletzt" wird der Index der Startzeile für die letzte Datenseite bestimmt? 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 durchlaufen werden. Wir können dies ProductsBLL
ermitteln, indem wir die Methode der TotalNumberOfProducts()
Klasse aufrufen. Lassen Sie uns eine schreibgeschützte Eigenschaft TotalRowCount
auf Seitenebene erstellen, die die Ergebnisse der TotalNumberOfProducts()
Methode zurückgibt:
private int TotalRowCount
{
get
{
// Return the value from the TotalNumberOfProducts() method
ProductsBLL productsAPI = new ProductsBLL();
return productsAPI.TotalNumberOfProducts();
}
}
Mit dieser Eigenschaft können wir nun den Index der letzten Seite der Ersten Zeile bestimmen. Insbesondere ist es das ganzzahlige Ergebnis des TotalRowCount
Minus 1 dividiert durch MaximumRows
, multipliziert mit MaximumRows
. Wir können jetzt die Click
Ereignishandler für die vier Seiten-Schnittstellenschaltflächen schreiben:
protected void FirstPage_Click(object sender, EventArgs e)
{
// Return to StartRowIndex of 0 and rebind data
StartRowIndex = 0;
Products.DataBind();
}
protected void PrevPage_Click(object sender, EventArgs e)
{
// Subtract MaximumRows from StartRowIndex and rebind data
StartRowIndex -= MaximumRows;
Products.DataBind();
}
protected void NextPage_Click(object sender, EventArgs e)
{
// Add MaximumRows to StartRowIndex and rebind data
StartRowIndex += MaximumRows;
Products.DataBind();
}
protected void LastPage_Click(object sender, EventArgs e)
{
// Set StartRowIndex = to last page's starting row index and rebind data
StartRowIndex = ((TotalRowCount - 1) / MaximumRows) * MaximumRows;
Products.DataBind();
}
Schließlich müssen wir die Schaltflächen "Erster" und "Vorheriger" in der Seitenseite deaktivieren, wenn die erste Seite mit Daten und die Schaltflächen "Weiter" und "Zuletzt" beim Anzeigen der letzten Seite angezeigt werden. Fügen Sie hierzu dem ObjectDataSource-Ereignishandler Selecting
den folgenden Code hinzu:
// Disable the paging interface buttons, if needed
FirstPage.Enabled = StartRowIndex != 0;
PrevPage.Enabled = StartRowIndex != 0;
int LastPageStartRowIndex = ((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 Seitenschnittstellenelemente basierend auf dem aktuellen Startzeilenindex hinzugefügt haben, testen Sie die Seite in einem Browser. Wie in Abbildung 15 dargestellt, werden beim ersten Besuch der Seite die Schaltflächen "Zuerst" und "Vorherige" deaktiviert. Beim Klicken auf "Weiter" wird die zweite Seite mit Daten angezeigt, während auf "Zuletzt" geklickt wird (siehe Abbildungen 16 und 17). Beim Anzeigen der letzten Datenseite sind die Schaltflächen "Weiter" und "Zuletzt" deaktiviert.
Abbildung 15: Die Schaltflächen "Vorherige" und "Zuletzt" sind beim Anzeigen der ersten Seite der Produkte deaktiviert (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Abbildung 16: Die zweite Seite der Produkte wird angezeigt (Zum Anzeigen des Bilds mit voller Größe klicken)
Abbildung 17: Klicken auf die letzte Seite der Daten (Klicken, um das Bild in voller Größe anzuzeigen)
Schritt 7: Einschließen der Sortierunterstützung mit dem benutzerdefinierten seitenorientierten Repeater
Nachdem das benutzerdefinierte Paging implementiert wurde, können wir die Sortierunterstützung einschließen. Die ProductsBLL
Methode der GetProductsPagedAndSorted
Klasse weist die gleichen startRowIndex - und maximumRows-Eingabeparameter auf wie GetProductsPaged
, erlaubt jedoch einen zusätzlichen SortExpression-Eingabeparameter . Um die GetProductsPagedAndSorted
Methode zu SortingWithCustomPaging.aspx
verwenden, müssen wir die folgenden Schritte ausführen:
- Ändern Sie die ObjectDataSource-Eigenschaft
SelectMethod
vonGetProductsPaged
zuGetProductsPagedAndSorted
. - Fügen Sie der ObjectDataSource-Auflistung ein
Parameter
SelectParameters
hinzu. - Erstellen Sie eine private Eigenschaft auf Seitenebene
SortExpression
, die ihren Wert über postbacks hinweg über den Ansichtszustand der Seite beibehalten. - Aktualisieren Sie den ObjectDataSource-Ereignishandler
Selecting
, um den ObjectDataSource s sortExpression-Parameter dem Wert der Eigenschaft auf SeitenebeneSortExpression
zuzuweisen. - Erstellen Sie die Sortierschnittstelle.
Aktualisieren Sie zunächst die ObjectDataSource-Eigenschaft SelectMethod
, und fügen Sie einen sortExpressionParameter
hinzu. Stellen Sie sicher, dass die Eigenschaft SortExpressionParameter
Type
auf String
gesetzt ist. Nach Abschluss dieser ersten beiden Aufgaben sollte das deklarative Markup von ObjectDataSource 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 ist, um den Zustand anzuzeigen. Wenn kein Sortierausdruckswert festgelegt wurde, verwenden Sie ProductName als Standard:
private string SortExpression
{
get
{
object o = ViewState["SortExpression"];
if (o == null)
return "ProductName";
else
return o.ToString();
}
set
{
ViewState["SortExpression"] = value;
}
}
Bevor ObjectDataSource die GetProductsPagedAndSorted
Methode aufruft, müssen wir die SortExpressionParameter
auf den Wert der SortExpression
Eigenschaft festlegen. Fügen Sie im Selecting
Ereignishandler die folgende Codezeile hinzu:
e.InputParameters["sortExpression"] = SortExpression;
Alles, was bleibt, besteht darin, die Sortierschnittstelle zu implementieren. Wie im letzten Beispiel haben wir die Sortierschnittstelle mithilfe von drei Schaltflächenwebsteuerelementen implementiert, mit denen der Benutzer die Ergebnisse nach Produktname, Kategorie oder Lieferant sortieren kann.
<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 Schaltflächensteuerelemente. Setzen Sie im Ereignishandler den StartRowIndex
Wert auf 0 zurück, legen Sie den SortExpression
entsprechenden Wert fest, und binden Sie die Daten erneut an den Repeater:
protected void SortByProductName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "ProductName";
Products.DataBind();
}
protected void SortByCategoryName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "CategoryName";
Products.DataBind();
}
protected void SortBySupplierName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "CompanyName";
Products.DataBind();
}
Das ist alles, was es gibt! Während es eine Reihe von Schritten gab, um benutzerdefinierte Paging und Sortierung implementiert zu werden, waren die Schritte mit denen vergleichbar, die für die Standard paging erforderlich sind. Abbildung 18 zeigt die Produkte beim Anzeigen der letzten Datenseite nach Kategorie.
Abbildung 18: Die letzte Seite der Daten, sortiert nach Kategorie, wird angezeigt (Klicken, um das Bild in voller Größe anzuzeigen)
Hinweis
In früheren Beispielen wurde beim Sortieren nach dem Lieferanten lieferantenname als Sortierausdruck verwendet. Für die implementierung der benutzerdefinierten Seitenverwaltung müssen wir jedoch "CompanyName" verwenden. Dies liegt daran, dass die gespeicherte Prozedur, die für die Implementierung von benutzerdefiniertem Paging GetProductsPagedAndSorted
zuständig ist, den Sortierausdruck in das ROW_NUMBER()
Schlüsselwort übergibt. Das ROW_NUMBER()
Schlüsselwort erfordert nicht einen Alias, sondern den tatsächlichen Spaltennamen. Daher müssen wir (den Namen der Spalte in der CompanyName
Tabelle) anstelle des alias verwenden Suppliers
, der in der SELECT
Abfrage (SupplierName
) für den Sortierausdruck verwendet wird.
Zusammenfassung
Weder die DataList noch der Repeater bieten integrierte Sortierunterstützung, aber mit einem Wenig Code und einer benutzerdefinierten Sortierschnittstelle können solche Funktionen hinzugefügt werden. Bei der Implementierung der Sortierung, aber nicht des Pagings kann der Sortierausdruck über das Objekt angegeben werden, das DataSourceSelectArguments
an die ObjectDataSource-Methode Select
übergeben wird. Diese DataSourceSelectArguments
Objekteigenschaft SortExpression
kann im ObjectDataSource-Ereignishandler Selecting
zugewiesen werden.
Zum Hinzufügen von Sortierfunktionen zu einer DataList- oder Repeater-Funktion, die bereits Seitenunterstützung bietet, besteht der einfachste Ansatz darin, die Geschäftslogikebene so anzupassen, dass sie eine Methode enthält, die einen Sortierausdruck akzeptiert. Diese Informationen können dann über einen Parameter in objectDataSource s SelectParameters
übergeben werden.
In diesem Lernprogramm wird die Analyse der Auslagerung und Sortierung mit den Steuerelementen DataList und Repeater abgeschlossen. Unser nächstes und letztes Lernprogramm wird untersuchen, wie Schaltflächenwebsteuerelemente zur DataList- und Repeater-Vorlagen hinzugefügt werden, um benutzerdefinierte, vom Benutzer initiierte Funktionen pro Element bereitzustellen.
Glückliche Programmierung!
Zum Autor
Scott Mitchell, Autor von sieben ASP/ASP.NET Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann bei mitchell@4GuysFromRolla.comerreicht werden.
Besonderer Dank an
Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Leitender Prüfer für dieses Lernprogramm war David Suru. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn ja, schicken Sie mir eine Nachricht an mitchell@4GuysFromRolla.com.