DevTrain

Autor: Hannes Preishuber

verschachteltes Master Detail mit Datalist und Gridview

Die üblichen ASP.NET 2.0 Master Detail Beispiele ziegen meist 2 Gridview Controls die nebeneinander platziert werden. Natürlich funktioniert das ganz auch in einander verschachtelt (nested). Dazu nehmen wir eine Datalist die 3 Datensätze nebeneinander darstellt und ein Gridview. Die Daten kommen aus der Northwind Datenbank und stellen die Orders und OrderDetail dar.

Der Kern der Lösung ist das das innenliegende Grid samt SQLDatasource in das Itemtemplate der Datalist platziert werden. Dabei erhält die OrderDetails Datasource einen Parameter um nur die passenden Details von der Datenbank zu holen.

<asp:DataList ID="DataList1" runat="server" DataKeyField="OrderID"
         DataSourceID="DSOrders" OnItemDataBound="DataList1_ItemDataBound" RepeatDirection=Horizontal RepeatColumns=4>
            <ItemTemplate>
                OrderID:
                <asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label><br />
                CustomerID:
                <asp:Label ID="CustomerIDLabel" runat="server" Text='<%# Eval("CustomerID") %>'>
                </asp:Label><br />
           <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID"
            DataSourceID="DSOrderDetails">
            <Columns>
                <asp:BoundField DataField="OrderID" HeaderText="OrderID" ReadOnly="True" SortExpression="OrderID" />
                <asp:BoundField DataField="Quantity" HeaderText="Quantity" SortExpression="Quantity" />
                <asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True" SortExpression="ProductID" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="DSOrderDetails" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConn %>"
            SelectCommand="SELECT [OrderID], [Quantity], [ProductID] FROM [Order Details] WHERE ([OrderID] = @OrderID)">
            <SelectParameters>
                <asp:Parameter Name="OrderID" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
               
                <br />
            </ItemTemplate>
        </asp:DataList><asp:SqlDataSource ID="DSOrders" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConn %>"
            SelectCommand="SELECT [OrderID], [CustomerID] FROM [Orders]">
</asp:SqlDataSource>

Die Zuordnung des Where Paramters muss dann pro Datensatz der Order Tabelle erfolgen. Dazu bietet sich das Itemdatabound Event der Datalist an. Dort wird die SQLDatasoruce per Findcontrol gefunden, in den passenden Typ gecastet und der Paramter per DefaultValue gesetzt. Die Order ID kommt aus dem Datakeys des Datalist Controls.

Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
        Dim s As SqlDataSource = e.Item.FindControl("DSOrderDetails")
        s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
End Sub

Dieser Artikel ist Daniel Spaude gewidmet, der genau diese Aufgabenstellung gelöst haben wollte. Hier ist es Daniel!:-)

Erfasst am: 17.10.2005 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=960
© Copyright 2003 ppedv AG - http://www.ppedv.de