Другое решение состоит в том, чтобы просто использовать два повторителя, один вложенный в другой. Вы можете передать свои группы с дочерними записями первому повторителю, а в ItemDataBound повторителя групп передать дочерние записи дочернему повторителю и вызвать там DataBind ().
Это больше кода, но на самом деле он дает вам больше контроля над макетом без кода создания HTML в вашем коде позади.
Как вы можете видеть здесь, у нас есть родительский повторитель, и в шаблоне элемента мы можем настроить каждую группу по своему усмотрению. В ChildRepeater у нас есть шаблон элемента, в котором мы можем настроить каждый элемент внутри группировки. Очень чистый и все с декларативным интерфейсом.
<asp:Repeater runat="server" id="GroupRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="HeaderText" />
<asp:Repeater runat="server id="ChildRepeater">
<ItemTemplate>
<asp:Literal runat="server" id="InfoGoesHere" />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
В коде позади мы можем получить что-то вроде этого:
private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//Get the child records, this can be any data structure you want
SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children;
//Find the child repeater
Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater;
childRepeater.ItemDataBound += SomeMethod;
childRepeater.DataSource = children;
childRepeater.DataBind();
}
После привязки каждого дочернего элемента вы можете подписаться на событие ItemDataBound и выполнить дочернее связывание с элементами управления, как считаете нужным.