Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Einträge numerieren im DataGrid

Geschrieben von: Alexander Zeitler
Kategorie: .NET Fu

Für eine Website wollte ich im Rahmen einer von mir entwickelten Online-Petition einen Zähler für die Anzahl der Einträge sowie die Nummer des aktuellen Eintrages im Stil "Eintrag 10 von 452" im DataGrid realisieren. Dabei stieß ich auf unerwarteten Widerstand seitens des DataGrids. Welcher Art dieser Widerstand war und wie eine mögliche Lösung aussehen könnte, möchte ich deshalb hier darstellen.

Das Problem

Um das Ziel zu verdeutlichen, zunächst ein Screenshot:

Wie man also sieht, sind alle Einträge des DataGrids über mehrere Seiten hinweg sauber fortlaufend numeriert. Doch wie erreicht man das? Grundlegend ist dieses Layout mit einer TemplateColumn realisiert, welche wie folgt aussieht (CSS-Definitionen und die Standard-Einträge aus der Datenquelle spare ich mir hier):

<asp:DataGrid id="SubscriberGrid" runat="server" 
             AllowPaging="True" AutoGenerateColumns="False" 
             PageSize="2" OnPageIndexChanged="SubscriberGrid_PageIndexChanged"> 
<ItemTemplate>
<table>
<tr>
<td>&nbsp;Eintrag Nr.: ... von ...</td>
</tr>
</table><br>
</ItemTemplate>
</asp:DataGrid>

Die Lösung

Die Gesamtzahl der Einträge ist relativ einfach zu ermitteln: Man wendet die Count-Methode der Datenquelle (hier die DataTable eines Typed DataSets namens subscribers) an und gibt diesen Wert mit .ToString() aus:

<%#subscribers.Tables[0].Rows.Count.ToString()%>

Die Ermittlung des aktuellen Eintrages ist etwas komplizierter. Zunächst könnte man annehmen, ein <%#(SubscriberGrid.Items.Count + 1).ToString()%> würde das Problem lösen, da hier bei jedem Item während des DataBindings der Count um 1 erhöht wird. Leider werden unsere Träume spätestens dann zerstört, wenn wir das Paging aktivieren. Das Resultat sieht dann wie folgt aus:

Wie man also sieht, beginnt das DataGrid auf jeder Seite neu bei 0 damit, die Items zu numerieren.

Um nun dennoch die Einträge von der ersten bis zur letzten Seite korrekt zu numerieren, müssen wir den Index der aktuellen Seite mit der Seitengröße (also der Anzahl an Items je Seite) multiplizieren. Zu diesem Produkt ist der Index des aktuellen Items plus 1 (da der Index nullbasierend ist) zu addieren. Diese Summe ist unser gesuchter aktueller Eintrag. In Code ausgedrückt lautet es wie folgt:

<%#((SubscriberGrid.CurrentPageIndex * SubscriberGrid.PageSize) + 
             SubscriberGrid.Items.Count + 1).ToString()

Somit lautet also das gesamte Konstrukt in der ItemTemplate folgendermaßen:

<td>&nbsp;Eintrag Nr.: 
             <%#((SubscriberGrid.CurrentPageIndex * SubscriberGrid.PageSize) + 
             SubscriberGrid.Items.Count + 1).ToString() %> von 
             <%#subscribers.Tables[0].Rows.Count.ToString()%></td>

Damit ist das Problem elegant gelöst. Als Bonus implementieren wir nun noch die Numerierung absteigend, dh der letzte Eintrag im DataGrid hat die Nummer 1:

Im Prinzip ändert sich nur der Algorithmus zur Errechnung des aktuellen Index:

<td>&nbsp;Eintrag Nr.: <%# (subscribers.Tables[0].Rows.Count - 
             (((SubscriberGrid.CurrentPageIndex) * SubscriberGrid.PageSize) + 
			 SubscriberGrid.Items.Count)).ToString() %> von 
			 <%#subscribers.Tables[0].Rows.Count.ToString()%></td>

Von der Gesamtzahl der Einträge ist die eben bereits ermittelte Zahl der Einträge abzuziehen - allerdings ohne den Index der Items um 1 zu erhöhen, da dieser "Fehler" bereits durch Rows.Count (welcher den tatsächlichen Wert liefert) kompensiert wird.

Schlußbemerkung

Die Implementierung der gezeigten Lösung ist sicher nicht der Weisheit letzter Schluß. Möglich wäre z.B. die Implementierung als eine in die CodeBehind-Datei ausgelagerte Helper-Funktion, um den "HTML-Code" schlank und verständlich zu halten. Allerdings gilt hier: "die Lösung ist das Ziel".

Verwandte Artikel

Das ASP.NET DataGrid selbst erweitern
Das DataTable Objekt in ADO.NET
DataGrid - Daten bearbeiten leicht gemacht
Datenaufbereitung in ADO.NET
Datenbankzugriff mittels ADO.NET
MouseOver-Effekte beim DataGrid
Pager- und Footerzeilen des DataGrid erweitern
Vergleich von DataGrid, DataList und Repeater-Control - was verwende ich wann?
Zahl, Datum und Währung korrekt formatiert ausgeben

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.