与处理ItemDataBound相比,处理数据源总是更干净,但在嵌套中继器时更是如此:
<asp:Repeater DataSource="<%#ColOfCol%>" runat="server">
<ItemTemplate>
<tr>
<asp:Repeater DataSource="<%#Container.DataItem%>" runat="server">
<ItemTemplate>
<td><%#SomeExtractingMethodLikeEval()%></td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>
内部数据源也可以是一个经过计算的属性,或对返回所需枚举的方法的调用.请注意,它将被一个对象调用.我更喜欢编写特定的版本,然后重载:
protected IEnumerable<string> GetNames(Family fam)
{
foreach(Person p in fam.Members)
yield return p.FirstName + " " + p.Surname;
}
protected IEnumerable<string> GetNames(object famObj)
{
return GetNames((Family)famObj);
}
需要注意的一点是,如果要获取父中继器中的当前对象,则必须使用以下命令获取该对象:
((RepeaterItem)Container.Parent.Parent).DataItem