ASP中继器中的嵌套类

时间:2015-02-13 10:22:34

标签: c# asp.net repeater

我有一个嵌套类,其中包含订单的订单商品:

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>

1 个答案:

答案 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中的列表绑定它。