DevTrain Startseite Visual Studio 1 Magazin  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Hannes Preishuber Artikel Drucken
        
Verschachtelte Tabellen mit Repeater und Relationen

Die Master Detail Darstellung von Daten gehört (wie schwarzer Kaffee mit viel Zucker) beinahe schon zu den Grundbedürfnissen eines Entwicklers. Bisher ging der Autor meist den Weg unter Verwendung eines Datagrids mit einer Reenderfunktion oder anderen Tricks. Details dazu finden sich hier auf www.devtrain.de.
Wenn man nicht zufällig in der Microsoft Knowledge Base über den Artikel Q326338  stolpert, tut man da vielleicht so bis an sein Lebensende. Da dieses noch fern ist, lohnt sich eine Betrachtung dieser Lösung.

Kern ist die verschachtelung von zwei Repeater Controls. Auch wenn es überraschend klingt, ja das funktioniert. Ein logisches Problem ergibt sich aus der ermittlung und zuweisung der Daten. Dazu werden die Datarelations von ADO.NET verwendet. Das ist auch ein sehr gutes Beispiel zur Anwendung von Releations in ASP.NET

Die beiden Repeater Controls werden im Designer auf die Website gezogen. Visuell lassen sich diese allerdings nicht verschachteln. So bleibt nur Handarbeit in der HTML Quellcode Ansicht.
<asp:Repeater id="rptMaster" runat="server">
  <asp:Repeater id="rptChild" runat="server">
  </asp:Repeater>
</asp:Repeater>

Die Felder die angezeigt werden sollen, müssen sich innerhalb des Itemtemplates oder Alternatigitemtemplates befinden. Die Rohdaten müssen innerhalb eines <%# %> stehen. Um die Daten aus der gebunden Tabelle zu holen wird die Databinder.Eval Funktion verwendet. Diese castet auch gleich in den String Datentyp. Aus dem Container wird dann das Feld au_id angezeigt.

<ItemTemplate>
  <b><%# DataBinder.Eval(Container.DataItem, "au_lname") %>
 <# DataBinder.Eval(Container.DataItem, "au_fname") %>
 </b><br>
  <asp:Repeater id="rptChild" runat="server">
  </asp:Repeater>
</ItemTemplate>

Für die richtige Fromatierung der Ausgabe müssen Sie selbst sorgen. Der Repeater macht nicht  einmal einen Zeilumbruch nach jeder Zeile. Dazu dient der BR Tag.

Jetzt kommt der entscheidende Punkt. Die ( noch nicht gecodete) Relation muss an den Child Repeater gebunden werden. Das geschieht meist im Quellcode über das Property Datasource. Dieses steht aber auch im Entwurfsmodus zu verfügung. Die Bindung erfolgt dann auf die Childrows der aktuellen Zeile.

<asp:Repeater id="rptChild" runat=server
datasource='<%# Container.DataItem.Row.GetChildRows("RelChild")
...
</asp:Repeater>

Würde man das im Code Behind machen, müsste das in dem Event ItemDataBound des Masters erfolgen.

Als nächstes bauen wir die Relation auf. Dazu wird die Pubs Datenbank verwendet. Bei der INstallation der .NET Samples, können sie auch die MSDE als Datenbank Server mitinstallieren. Diese wird als Instanz NetSDK installiert. Dort findet sich dann auch die Datenbank. Falls Ihre Daten woanders zu finden sind muss der Connection String angepasst werden bzw statt dem Provider SQLClient der OLEDB verwendet werden. Die beiden Tabellen werden über einen Dataadapter geholt und in ein Datset gelegt.
Dort wird über die beiden Schlüsselfelder au_id die Verbindung hergestellt. Dann fehlt nur noch die Zuweisung der Datasource an den Master. Die Zuweisung an den Client erfolgt in der ASPX Seite um jeweils nur die Untermenge aus titelauthors anzuzeigen.

Dim con As SqlConnection = New SqlConnection("server=(local)NetSDK;database=pubs;Integrated Security=SSPI")
Dim cmd1 As SqlDataAdapter = New SqlDataAdapter("select * from authors", con)
Dim ds As DataSet = New DataSet
cmd1.Fill(ds, "authors")
Dim cmd2 As SqlDataAdapter = New SqlDataAdapter("select * from titleauthor", con)
cmd2.Fill(ds, "titleauthor")
ds.Relations.Add("relChild", _
ds.Tables("authors").Columns("au_id"), _
ds.Tables("titleauthor").Columns("au_id"))
rptMaster.DataSource = ds.Tables("authors")
Page.DataBind()
con.Close()


Vergessen Sie nie Databind aufzurufen um die Datenbindung an die Controls zu aktivieren. Zum guten Ton gehört es, die Connection sofort über Close wieder zu schliessen um Sie für das pooling frei zu geben.

Die Ausgabe im Browser sieht dann wie folgt aus.

White1 Johnson
PS3333
Green Marjorie
BU1032
BU2075
Carson Cheryl
PC1035
O'Leary Michael
BU1111
TC7777
Straight Dean
BU7832
Smith Meander
Bennet Abraham

Hier spielt ASP.NET seine Vorteile voll aus. Die Daten werden nur einma vom Server geholt. Der Repeater bietet allerdings wenig Komfort. Wenn es um das Editieren von Daten oder Blättern geht, bietet das Datagrid mehr.


DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine Links vorhanden

  Erfasst am: 22.01.2003
  Gültig bis: 21.02.2003
8 Ratings
Bewertung: 67,5%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG