中继器的中继器

我有一个中继器内的中继器。 父代中继器绑定到Datatable列中。

我想将子中继器绑定到父中继器数据行中的数据表列

这可能吗? 我想我可以直接在aspx文件中这样做:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"但似乎没有工作。

在父节点中,将方法附加到OnItemDataBound事件中,并在该方法中find嵌套的中继器并将其绑定。

示例(.aspx):

 <asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ItemBound"> <ItemTemplate> <!-- Repeated data --> <asp:Repeater ID="ChildRepeater" runat="server"> <ItemTemplate> <!-- Nested repeated data --> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> 

示例(.cs):

 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ParentRepeater.DataSource = ...; ParentRepeater.DataBind(); } } protected void ItemBound(object sender, RepeaterItemEventArgs args) { if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem) { Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater"); childRepeater.DataSource = ...; childRepeater.DataBind(); } } 

我会添加一个DataBinding事件到子中继器本身:

 <asp:Repeater ID="parentRepeater" runat="server"> <asp:Repeater ID="childRepeater" runat="server" OnDataBinding="childRepeater_DataBinding" /> </asp:Repeater> 

然后只是实现它:

 protected void childRepeater_DataBinding(object sender, System.EventArgs e) { Repeater rep = (Repeater)(sender); int someIdFromParentDataSource = (int)(Eval("ParentID")); // Assuming you have a function call `GetSomeData` that will return // the data you want to bind to your child repeater. rep.DataSource = GetSomeData(int); rep.DataBind(); } 

我更喜欢在控件级别而不是ItemDataBound级别执行此操作,因此如果您必须删除模板中的控件或项目,则不必担心在使用它的父控件中查找代码。 它得到的所有本地化与他自己控制。 另外,你永远不必做一个FindControl

如果你想在将来replace一个控件,你可以删除它,你的代码仍然可以工作,因为它是完全独立的。 使用ItemDataBound将导致您的代码仍然编译,但在运行时意外崩溃或行为,因为它依赖于子控件。

这是如何完成的:

 DataSource='<%# ((System.Data.DataRowView)Container.DataItem)[3] %>' 

所以,如果你知道父表中包含嵌套中继器的子表/数据源的列,你可以直接把它放在aspx文件中。

如果我需要这样做,我通常使用父转发器的ItemDataBound事件来绑定子转发器。 如果e是您的EventArgs参数,您将可以通过e.Item.FindControl()访问子中继器,并通过e.Item.DataItem访问数据。

这里是一个如何做到这一点的例子: 嵌套中继器控制的文章

Repeater1 OnItemDataBound事件,然后FindControl Repeater2。 代码隐藏不会find嵌套的Repeater2! 你必须使用FindControl(“Repeater2”)。

 protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.DataItem != null) { MemberView dataRow = (MemberView)e.Item.DataItem; var cat = MemberPresenter.getMemberID(dataRow.memID); Repeater rp2 = (Repeater)e.Item.FindControl("Repeater2"); rp2.DataSource = cat; rp2.DataBind(); } } 
  protected void MainRepeater_ItemDataBound(object sender, RepeaterItemEventArgs args) { if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem) { Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater"); DataTable innerTable= ((DataRowView)args.Item.DataItem)["InnerTableColumnName"] as DataTable; childRepeater.DataSource = tasksDetails; childRepeater.DataBind(); } }