DevTrain .NET Developers Home. Das Community Portal für ASP.NET, Visual Basic, C#
 
  Login Status: Hallo   Anmelden  Suche:  
Navigationslinks überspringen
Startseite
Artikel
Blogs
Foren
ClubClub erweitern

 
Ihre Optionen
Save
Mail
Print
Rate
 
Advertising
  DevTrain Camp – Schneller zum .NET 4.0 Developer!

 
Navigationslinks überspringen
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!:-)
Diskutieren Sie in den Foren

Fit for Admin – Ihr Windows Server 2008 R2 Intensiv-Training!