すべての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>