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






3.90/5 (8投票s)
本文是关于嵌套数据绑定控件,如 Repeater、Grid 等。
引言
本文演示了如何在 ASP.NET 页面中将 Repeater
控件嵌套到任意级别。 使用相同的方式,您可以嵌套其他数据绑定控件,如 DataGrid
、GridView
和 DataList
。
使用代码
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>
关注点
这里最重要的事情是了解事件及其发生顺序。 数据绑定控件的三个非常基本但功能最强大的事件是 ItemCreated
、ItemCommand
和 ItemDatabound
。 必须很好地了解如何处理这些事件,以满足这种数据呈现的尖端要求。
首先,让我解释一下 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
绑定。 我们在哪里做? 当然,外部 Repeater
的 ItemDatabound
是最好的地方。
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.
}
}
希望本文能帮助您了解如何嵌套数据绑定控件。
结论
通过遵循相同的过程,像 Repeater
、DataList
、GridView
和 DataGrid
这样的数据绑定控件可以将数据嵌套到任何级别。 祝你们编程愉快。