65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET 中嵌套数据绑定(Repeater)控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.90/5 (8投票s)

2007年8月27日

CPOL

2分钟阅读

viewsIcon

75294

downloadIcon

1145

本文是关于嵌套数据绑定控件,如 Repeater、Grid 等。

引言

本文演示了如何在 ASP.NET 页面中将 Repeater 控件嵌套到任意级别。 使用相同的方式,您可以嵌套其他数据绑定控件,如 DataGridGridViewDataList

使用代码

Web 开发人员总是需要连接到不同类型的数据库并从中提取信息,然后以有组织的形式将其呈现在网页上。 ASP.NET 提供了数据访问控件来连接外部数据源。 它还提供了几个 UI 控件以有组织的方式呈现这些信息。

Repeater 控件是用于上述目的的控件之一。 它专门设计用于处理数据表,但也可以与其他数据源一起使用。

Repeater 控件可用于编辑数据库以及在网页上显示数据。

本文的重点是嵌套数据绑定控件。 我在这里使用 Repeater 控件作为示例。 通过遵循相同的模式,您可以将任何其他数据绑定控件嵌套到您想要的级别。 这里最重要的事情是了解事件以及事件的顺序。

在本文中,我将 Repeater 控件嵌套到了两层,但我想你可以使用这种技术嵌套到任何级别。

首先,让我解释一下为什么我们必须嵌套数据绑定控件。 假设我们有无限的地址类型,并且您可以为每种类型的地址添加无限的地址。 为了根据地址类型呈现地址,我们需要嵌套一个 Repeater 控件。

我的页面设计以及对重要内容的解释如下所示

<asp:Repeater id="RepeaterAdd" runat="server">
<ItemTemplate>
    <div>
         <asp:Label ID="lblHead" runat="server" CssClass="level2">
              <%# DataBinder.Eval(Container.DataItem, "LKI_NAME") %>
                   Addresses:
         </asp:Label>
    </div>

    //Here LKI_NAME contain Address Types description like "Home", 
    // "Office" etc         <br />
    //Here I have nested Child Repeater control inside my main repeater. 
    // Main repeater "RepeaterAdd" contains address types while repeater 
    // "Rchild" contains address related to each address type.
    <asp:Repeater ID="Rchild" runat="server">
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" CssClass="modulebox" 
            Width="100">Address Line1:</asp:Label>  
        <asp:Label ID="lbl1" runat="server" CssClass="moduleBoxBlack">
            <%# DataBinder.Eval(Container.DataItem, "ADR_ADDRESSL1") %>
        </asp:Label>
        <br />
            <asp:Label ID="Label2" runat="server" CssClass="modulebox"
                Width="100">Address Line2:</asp:Label></b>   
            <asp:Label ID="lbl2" runat="server" CssClass="moduleBoxBlack">
                <%# DataBinder.Eval(Container.DataItem, "ADR_ADDRESSL2")%>
            </asp:Label>
        <br />
            <asp:Label ID="Label4" runat="server" CssClass="modulebox" 
                Width="100">City Name:</asp:Label>  
            <asp:Label ID="lbl4" runat="server" CssClass="moduleBoxBlack">
                <%# DataBinder.Eval(Container.DataItem, "ADR_CITYNAME") %>
            </asp:Label>
        <br />
            <asp:Label ID="Label3" runat="server" CssClass="modulebox" 
                Width="100">State:</asp:Label>  
            <asp:Label ID="lbl3" runat="server" CssClass="moduleBoxBlack">
                <%# DataBinder.Eval(Container.DataItem, "ADR_STATENAME")%>
            </asp:Label>
        <br />
            <asp:Label ID="Label5" runat="server" CssClass="modulebox" 
                Width="100">Postal Code:</asp:Label>  
            <asp:Label ID="lbl5" runat="server" CssClass="moduleBoxBlack">
                <%# DataBinder.Eval(Container.DataItem,"ADR_POSTALCODE")%>
            </asp:Label>
        <br />
            <asp:Label ID="Label6" runat="server" CssClass="modulebox" 
                Width="100">Country:</asp:Label>              
            <asp:Label ID="lbl6" runat="server" CssClass="moduleBoxBlack">
                <%# DataBinder.Eval(Container.DataItem, "CNT_NAME") %>
            </asp:Label>    
            <asp:LinkButton Runat="server" ID="LnkEdit" 
                CssClass="LinkBtn">Edit</asp:LinkButton>
                    
            <asp:LinkButton Runat="server" ID="lnkDelete" 
                CommandName="DeleteMe" 
                CommandArgument='<%# DataBinder.Eval(Container.DataItem, 
                "ADR_ID") %>' CssClass="LinkBtn">Delete</asp:LinkButton>
        <br /><br />
    </ItemTemplate>
</asp:Repeater><br />  
<asp:Button ID="btnAdd" Text="Add" runat="server" 
         CssClass="button" CommandName="OpenPopup" />
    <br /><br /><br />         
</ItemTemplate></asp:Repeater>

关注点

这里最重要的事情是了解事件及其发生顺序。 数据绑定控件的三个非常基本但功能最强大的事件是 ItemCreatedItemCommandItemDatabound。 必须很好地了解如何处理这些事件,以满足这种数据呈现的尖端要求。

首先,让我解释一下 ItemCreated 事件,它实际上实现了捕获嵌套(内部)Repeater 事件的技巧。 该事件的代码是

private void RepeaterAdd_ItemCreated(object sender, 
             System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    Repeater r = ((Repeater)e.Item.FindControl("Rchild"));
    r.ItemCommand += new RepeaterCommandEventHandler(
        this.RepeaterInner_ItemCommand);
    r.ItemDataBound += new RepeaterItemEventHandler(
        this.RepeaterInner_ItemDataBound);
}

其次,我们需要将数据与我们的内部 Repeater 绑定。 我们在哪里做? 当然,外部 RepeaterItemDatabound 是最好的地方。

private void RepeaterAdd_ItemDataBound(object sender, 
        System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DataRowView drv = (DataRowView)e.Item.DataItem;
        string AddressType = drv["LKI_NAME"].ToString();
        string AddressTypeId = drv["LKI_ID"].ToString();
        //DataTable dt = new DataTable();
        //Bind your inner repeater here.
        Repeater r = ((Repeater)e.Item.FindControl("Rchild"));
        r.DataSource = dt; //Suppose dt is the data table to bind.
        r.DataBind();
        //Bind the add button here.
        Button btn = ((Button)e.Item.FindControl("btnAdd"));
        btn.Attributes["onclick"] = 
            string.Format("return ShowAddressForm('{0}','{1}',
            '{2}');", "Add", AddressType, AddressTypeId);
    }
}

在这个阶段,我们已经完成了基本步骤。 剩下的唯一步骤是如何捕获命令。 ItemCommand 是我们必须使用的事件。 下面是一个处理内部 Repeater 命令的示例。

private void RepeaterInner_ItemCommand(object source, 
        System.Web.UI.WebControls.RepeaterCommandEventArgs e)
{
    strin cmdArgument = e.CommandArgument.ToString();
    if (e.CommandName == "EditMe")
    {
        // Do Edit Link Operation here.
    }
    else if (e.CommandName == "DeleteMe")
    {
        //Do Delete Link Opearation here.
    }
}

希望本文能帮助您了解如何嵌套数据绑定控件。

结论

通过遵循相同的过程,像 RepeaterDataListGridViewDataGrid 这样的数据绑定控件可以将数据嵌套到任何级别。 祝你们编程愉快。

© . All rights reserved.