Повторитель в Повторителе - PullRequest
42 голосов
/ 27 мая 2010

У меня есть повторитель внутри повторителя. Где родительский повторитель связан с Datatble, в котором есть столбец с Datatable.

Я хотел бы привязать дочерний репитер к столбцу данных в базе данных родительского репитера

Возможно ли это? я думал, что могу сделать это напрямую в файле aspx, например:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>" но это не похоже на работу.

Ответы [ 7 ]

77 голосов
/ 27 мая 2010

В родительском повторителе присоедините метод к событию 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();
    }
}
24 голосов
/ 27 мая 2010

Я бы добавил событие 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 может привести к тому, что ваш код все еще будет компилироваться, но падать или работать непредвиденно во время выполнения из-за его зависимости от дочерних элементов управления.

8 голосов
/ 27 мая 2010

Вот как это делается:

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

Итак, если вам известен столбец в родительской таблице, содержащий дочернюю таблицу / источник данных для вложенного повторителя, вы можете поместить его непосредственно в файл aspx.

2 голосов
/ 20 января 2012

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();
    }  
}
2 голосов
/ 27 мая 2010

Если мне нужно сделать это, я обычно делаю это, используя событие ItemDataBound родительского повторителя, чтобы связать дочерний повторитель. Если e является параметром EventArgs, у вас будет доступ к дочернему повторителю через e.Item.FindControl () и доступ к данным через e.Item.DataItem.

1 голос
/ 27 мая 2010

Вот пример того, как это сделать: Артикул для контроля вложенных репитеров

0 голосов
/ 05 июня 2016
 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();
            }
    }
...