所有 ASP.NET 数据绑定控件(Repeater、ListView、GridView 等)都可以对其数据源使用声明性数据绑定。这不是很好的 IMO 记录,但您可以执行以下操作:
<asp:Repeater ID="rptCategory">
<ItemTemplate>
<asp:Repeater ID="rptSubcategory" DataSource='<%#Eval("Subcategories")%>'>
<ItemTemplate>
<asp:Repeater ID="rptItems" DataSource='<%#Eval("Items")%>'>
<ItemTemplate>
<%#Eval("Name")%>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
您需要绑定到DataSource
属性的具体细节取决于您的初始数据(rptCategory 绑定到的数据)。
如果它是DataSet
,那么您需要构建DataRelations
并使用适当的名称DataRelation
。
如果它是 C# 对象,那么您需要使用集合属性的名称。
编辑:关于这个特定模式的细节如下......
对于您的架构,您需要 2 个嵌套中继器 - 1 个用于处理项目,1 个用于处理子类别(其项目将具有另一个嵌套中继器)。
使用 DataSets,您可以执行以下操作(注意这是粗略的代码,您需要填写一些缺失的步骤):
var ds = ExecuteDataSet(
@"SELECT Id, Title FROM Cat;
SELECT Id, CatId, Title FROM SubCat;
SELECT Id, CatId, SubCatId, Title FROM Items;"
);
ds.DataRelations.Add("Cat_SubCat", ds.Tables["Cat"].Columns["Id"], ds.Tables["SubCat"].Columns["CatId"]);
ds.DataRelations.Add("Cat_Items", ds.Tables["Cat"].Columns["Id"], ds.Tables["Items"].Columns["CatId"]);
ds.DataRelations.Add("SubCat_Items", ds.Tables["SubCat"].Columns["Id"], ds.Tables["Items"].Columns["SubCatId"]);
this.rptCategory.DataSource = ds;
this.rptCategory.DataBind();
<asp:Repeater ID="rptCategory">
<ItemTemplate>
<h2>Category <%#Eval("Title")%></h2>
<asp:Repeater ID="rptCatItems" DataSource='<%#Eval("Cat_Items")%>'>
<ItemTemplate>
<h4>Item (Category) <%#Eval("Title")%></h4>
</ItemTemplate>
</asp:Repeater>
<asp:Repeater ID="rptCatSubCat" DataSource='<%#Eval("Cat_SubCat")%>'>
<ItemTemplate>
<h3>SubCategory <%#Eval("Title")%></h3>
<asp:Repeater ID="rptSubCatItems" DataSource='<%#Eval("SubCat_Items")%>'>
<ItemTemplate>
<h4>Item (SubCategory) <%#Eval("Title")%></h4>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>