我有一个嵌套类,其中包含订单的订单商品:
public class Order
{
public int ItemID { get; set; }
public int CustomerId { get; set; }
...
public List<OrderItem> Items { get; set; }
}
public class OrderItem
{
public int ItemId { get; set; }
...
}
我有这个数据绑定到asp转发器
var result = [method to get data]
rptOrders.DataSource = result;
rptOrders.DataBind();
在ascx页面中我有
<asp:Repeater ID="rptOrders" runat="server" HideControlForZeroRows="true" ZeroRowsText="You have no orders.">
<HeaderTemplate>
<table>
<tr class="tableHeader">
<td>Order #</td>
...
</tr>
</HeaderTemplate>
<ItemTemplate>
<ItemTemplate>
<tr>
<td><a href='#'><%# Eval("ItemID") %></a></td>
...
</tr>
</ItemTemplate>
但我想使用手风琴来隐藏订单详细信息,例如:http://jsfiddle.net/Xqk3m/,这意味着我必须在我的转发器表中为嵌套类项添加行。
如何引用嵌套类让另一个转发器遍历元素以为每个嵌套项添加一个?
我环顾网络,一般他们建议我有一个嵌套的转发器分别调用嵌套类,但实际上我想利用我已经定义好的类这一事实。希望我可以做类似的事情:
//parent repeater
<asp:Repeater ID="rptOrders" runat="server" HideControlForZeroRows="true" ZeroRowsText="You have no orders.">
....
//nested repeater
<asp:Repeater ID="rptOrderItems" runat="server" HideControlForZeroRows="true">
但是如何引用订单的订单商品?
<asp:Repeater runat="server" DataSource="<%# Container.DataItem %>">
<ItemTemplate>
<tr>
<td><%# Eval("ItemId") %></td>
</tr>
</ItemTemplate>
</asp:Repeater>
答案 0 :(得分:2)
您可以将ItemDataBound事件添加到rptOrders repeater:
protected void rptOrders_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var order = (Order)e.Item.DataItem;
Repeater innerRep = e.Item.FindControl("rptOrderItems") as Repeater;
innerRep.DataSource = order.Items;
innerRep.DataBind();
}
实际上,您可以在转发器项目中包含任何其他数据绑定控件,并使用DataItem中的列表绑定它。