コントロール Repeater をネストする方法を教えてください。
ASP.NETでは、RepeaterコントロールのItemTemplateに別のRepeaterコントロールをネストすることでRepeaterのネスト利用が可能です。
以下にサンプルコードを示します。
<asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerRepeater_ItemDataBound">
<ItemTemplate>
<h3>Outer Item: <%# Container.ItemIndex + 1 %></h3>
<asp:Repeater ID="innerRepeater" runat="server">
<ItemTemplate>
<p>Inner Item: <%# Container.ItemIndex + 1 %></p>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
コードの中で、外側のRepeaterコントロールはouterRepeaterと命名され、内側のRepeaterコントロールはinnerRepeaterと命名されています。外側のRepeaterのItemTemplateには、内側のRepeaterがネストされています。コードの中では、OnItemDataBoundイベントも追加されており、これにより内側のRepeaterのデータが動的にバインドされます。
コードのバックエンド側では、以下のようにデータバインディングできます。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<OuterItem> outerItems = GetOuterItems(); // 获取外部Repeater的数据
outerRepeater.DataSource = outerItems;
outerRepeater.DataBind();
}
}
protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
OuterItem outerItem = (OuterItem)e.Item.DataItem;
innerRepeater.DataSource = outerItem.InnerItems; // 绑定内部Repeater的数据
innerRepeater.DataBind();
}
}
コードでは、Page_Loadイベントで外部Repeaterのデータバインドを行っている。outerRepeater_ItemDataBoundイベントで、FindControlメソッドを使い内部Repeaterコントロールを検索し、データバインドを行っている。
内部Repeaterコントロールのデータバインドは外部RepeaterのItemDataBoundイベントで行う点に注意してください。内部Repeaterのデータソースは外部Repeaterの現在の項目に依存しているためです。