44

我在中继器中有一个中继器。父中继器绑定到 a 的位置Datatble,其中有一列带有 a Datatable

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

这可能吗?我在想我可以直接在aspx文件中执行此操作,例如:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>"但它似乎不起作用。

4

7 回答 7

82

在父中继器中,为 OnItemDataBound 事件附加一个方法,并在该方法中找到嵌套中继器并对其进行数据绑定。

示例(.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();
    }
}
于 2010-05-27T16:58:24.493 回答
26

我会向子中继器本身添加一个 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.

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

于 2010-05-27T17:03:43.323 回答
8

这是如何完成的:

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

因此,如果您知道父表中包含嵌套转发器的子表/数据源的列,您可以将其直接放在 aspx 文件中。

于 2010-05-27T18:51:44.733 回答
2

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

于 2010-05-27T16:58:43.887 回答
2

Repeater1 OnItemDataBound 事件,然后 FindControl Repeater2。代码隐藏将找不到嵌套的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();
    }  
}
于 2012-01-20T03:14:53.743 回答
1

以下是如何执行此操作的示例: 嵌套转发器控件的文章

于 2010-05-27T17:10:35.413 回答
0
 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();
            }
    }
于 2016-06-05T11:29:16.577 回答