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"] %>



<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实现)

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯