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

Einträge numerieren im DataGrid

Geschrieben von: Alexander Zeitler
Kategorie: .NET Fu

This printed page brought to you by AlphaSierraPapa

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

This printed page brought to you by AlphaSierraPapa

Verwandte Artikel

Das ASP.NET DataGrid selbst erweitern
http:/www.aspheute.com/artikel/20030909.htm
Das DataTable Objekt in ADO.NET
http:/www.aspheute.com/artikel/20001116.htm
DataGrid - Daten bearbeiten leicht gemacht
http:/www.aspheute.com/artikel/20040929.htm
Datenaufbereitung in ADO.NET
http:/www.aspheute.com/artikel/20001106.htm
Datenbankzugriff mittels ADO.NET
http:/www.aspheute.com/artikel/20001102.htm
MouseOver-Effekte beim DataGrid
http:/www.aspheute.com/artikel/20040628.htm
Pager- und Footerzeilen des DataGrid erweitern
http:/www.aspheute.com/artikel/20040318.htm
Vergleich von DataGrid, DataList und Repeater-Control - was verwende ich wann?
http:/www.aspheute.com/artikel/20040303.htm
Zahl, Datum und Währung korrekt formatiert ausgeben
http:/www.aspheute.com/artikel/20020704.htm

 

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