DataGrid + DataList 套用主從式資料的顯示方式
在 .net 平台分散式應用程式 (3) - ASP.NET 網頁設計技巧 (文章編號:N021201102) 文章中,在 DataSet 中建立關聯式的資料表,並分別套用到 DataGrid 與內層的 DataList。
其中外層的 DataGrid 可直接利用 Eval 繫結相關的資料欄位,但在內層的 DataList 卻行不通。
原因在於 DatList 的資料來源是利用 DataRow.GetChildRows(DataRelation) 取回的 DataRow[] 陣列 (該函式是從父階 DataRow 取得所有關聯子階的 DataRow)
所以繫結必須先做型別轉換才可以
<%# ((System.Data.DataRow)Container.DataItem)["Author"] %>
或者這種方式也可以
<%# (Container.DataItem as System.Data.DataRow)["Author"] %>
DataList嵌套DataList(3.使用DataRelation实现)
其中外層的 DataGrid 可直接利用 Eval 繫結相關的資料欄位,但在內層的 DataList 卻行不通。
原因在於 DatList 的資料來源是利用 DataRow.GetChildRows(DataRelation) 取回的 DataRow[] 陣列 (該函式是從父階 DataRow 取得所有關聯子階的 DataRow)
所以繫結必須先做型別轉換才可以
<%# ((System.Data.DataRow)Container.DataItem)["Author"] %>
或者這種方式也可以
<%# (Container.DataItem as System.Data.DataRow)["Author"] %>
<asp:DataGrid ID="dgBook" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" onitemdatabound="dgBook_ItemDataBound"> <AlternatingItemStyle BackColor="White" ForeColor="#284775" /> <Columns> <asp:TemplateColumn HeaderText="書號"> <ItemTemplate> <asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>'></asp:Label> </ItemTemplate> </asp:TemplateColumn> <asp:TemplateColumn HeaderText="書名"> <ItemTemplate> <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> </ItemTemplate> </asp:TemplateColumn> <asp:TemplateColumn HeaderText="售價"> <ItemTemplate> <asp:Label ID="lblPrice" runat="server" Text='<%# Eval("Price") %>'></asp:Label> </ItemTemplate> </asp:TemplateColumn> <asp:BoundColumn HeaderText="分類"></asp:BoundColumn> <asp:TemplateColumn HeaderText="作者"> <ItemTemplate> <asp:DataList ID="dlAuthor" runat="server"> <ItemTemplate> <asp:Label ID="txtAuthor" runat="server" Text='<%# ((System.Data.DataRow)Container.DataItem)["Author"] %>'></asp:Label> </ItemTemplate> </asp:DataList> </ItemTemplate> </asp:TemplateColumn> <asp:TemplateColumn HeaderText="數量"> <ItemTemplate> <asp:TextBox ID="txtQty" runat="server" Columns="5"></asp:TextBox> </ItemTemplate> </asp:TemplateColumn> </Columns> <EditItemStyle BackColor="#999999" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <ItemStyle BackColor="#F7F6F3" ForeColor="#333333" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> </asp:DataGrid>
protected void dgBook_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemIndex >= 0)
{
// 找到 DataList
DataList dl = e.Item.FindControl("dlAuthor") as DataList;
// 取出這筆資料的 Key 值就是書號
string key = dgBook.DataKeys[e.Item.ItemIndex].ToString();
// 從 DataSet 中找出目前這筆記錄
DataRow dr = ds.Tables["books"].Rows.Find(key);
// 透過 GetChildRows 取出這筆記錄的作者記錄集合 (DataRow 集合)
dl.DataSource = dr.GetChildRows("Book_Author");
dl.DataBind();
}
}
DataList嵌套DataList(3.使用DataRelation实现)
留言