Я обнаружил, что самый простой способ сделать вложенные повторители, не беспокоясь о событиях привязки данных, это просто установить DataSource с использованием синтаксиса <%# %>
.
Например:
<asp:Repeater runat="server" id="Departments">
<ItemTemplate>
Name: <%# Eval("DeptName") %>
Employees:
<asp:Repeater runat="server" DataSource='<%# Eval("Employees") %>'>
<ItemTemplate><%# Eval("Name") %></ItemTemplate>
<SeparatorTemplate>,</SeparatorTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Предполагается, что у вашего класса Departments есть свойство Employees, например:
public class Department {
public string DeptName {get; set;}
public IEnumerable<Employee> Employees {get; set;}
}
public class Employee {
public string Name {get; set;}
}
Если ваш объект внешнего повторителя не имеет свойства, соответствующего объекту внутреннего повторителя, вы все равно можете использовать этот трюк, добавив метод в свой код, который выполняет вычисления. Таким образом, ваш внутренний ретранслятор может стать:
<asp:Repeater runat="server" DataSource='<%# GetEmployees(Container.DataItem) %>'>
и тогда GetEmployees может выглядеть примерно так:
protected IEnumerable<Employee> GetEmployees(object item) {
var dept = (Department) item;
// then do whatever is necessary to get the employees from dept
return employees;
}