Verschachtelte Listen Controls sind mit ASP.NET einfach zu verwirklichen. Es gibt auf DevTrain bereits einige Artikel dazu. Nun bin ich aber kein Freund von Source Code und nur "kein Code" ist guter Code. In diesem Sinne beschreibe ich dieses mal, wie man zwei oder mehrere Gridview Controls verschachtelt ohne eine Zeile Code zu schreiben. Alles wird per Deklaration erledigt.
Zunächst möchte ich einmal das Ergebnis vorstellen. Ein Gridview zeigt in der ersten Spalte den Bestellkopf. Die Details pro Bestellung werden rechts daneben nebeneinander dargestellt mittels eines Datalist Control.
Grundsätzlich wird ein Gridview verwendet das zusätzlich ein Templatefield erhält. In dieses Feld kommen drei Bausteine:
- Ein Hidden Field das als Steuerquelle für die verschachtelten Daten dient
- Eine Datalist die zur Anzeige der Daten dient
- ein SQL Datasource mit einem Parameter für die Where Bedingung
Das Ganze sieht dann innerhalb des Templatefields des Gridviews so aus:
<ItemTemplate> <asp:HiddenField id="orderid" runat="server" Value='<%#eval("orderid") %>'/> <asp:DataList ID="DataList1" runat="server" DataKeyField="OrderID" DataSourceID="DSOrderDetails" RepeatDirection="Horizontal"> <ItemTemplate> ProductID: <asp:Label ID="ProductIDLabel" runat="server" Text='<%# Eval("ProductID") %>'></asp:Label><br /> UnitPrice: <asp:Label ID="UnitPriceLabel" runat="server" Text='<%# Eval("UnitPrice") %>'></asp:Label><br /> Quantity: <asp:Label ID="QuantityLabel" runat="server" Text='<%# Eval("Quantity") %>'></asp:Label><br /> Discount: <asp:Label ID="DiscountLabel" runat="server" Text='<%# Eval("Discount") %>'></asp:Label><br /> <br /> </ItemTemplate> </asp:DataList> <asp:SqlDataSource ID="DSOrderDetails" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConn %>" SelectCommand="SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE ([OrderID] = @OrderID)"> <SelectParameters> <asp:ControlParameter ControlID="orderid" Name="OrderID" PropertyName="Value" Type="Int32" /> </SelectParameters> </asp:SqlDataSource> </ItemTemplate> |
Nur wenn sich ein Control inherhalb des gleichen Templates befindet kann es vom DataSource Control als Controlparameter verwendet werden.