如何使用属性集合绑定到嵌套的DataList

时间:2013-11-14 20:15:40

标签: c# asp.net datalist

我已经看过(3)在ASP.NET中使用嵌套DataList或Repeater的不同示例,但都使用原始DataTable/DataSetCreateChildView调用的组合来创建外部和内部DataList之间的关系。

好吧,因为它是2013年,而不是2003年,我有一个具有以下结构的课程:

public class Customer
{    
   public string FullName { get; set; }   
   public List<Orders> { get; set; }   
}

我们的想法是Orders集合被绑定为内部嵌套 DataSource的{​​{1}}。问题是我似乎无法弄清楚如何在绑定代码中建立关​​系。内部DataList实际上可以通过Intellisense在代码中直接访问,因为它嵌套在主DataList下。以下是DataList事件中的典型代码,用于查找内部ItemDataBound并使用DataList分配其DataSource

CreateChildView
我看到的所有示例中的

“OrdersRelation”设置如下:

protected void outerRep_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
        DataRowView drv = e.Item.DataItem as DataRowView;
        DataList innerDataList = e.Item.FindControl("innerDataList") as DataList;
        innerDataList.DataSource = drv.CreateChildView("OrdersRelation");
        innerDataList.DataBind();
    }
}

显然这不适用,因为我正在使用一个强类型对象,其中包含'Orders'的集合属性。

如何获得相同的结果并将内部// Attach the relationship to the dataSet ds.Relations.Add(new DataRelation("OrdersRelation", ds.Tables[0].Columns["OrderID"], ds.Tables[1].Columns["OrderID"])); outerDataList.DataSource = ds.Tables[0]; outerDataList.DataBind(); 绑定到我的DataList集合属性?

1 个答案:

答案 0 :(得分:0)

我想出来了;刚刚回过头来讨论“ASP.NET服务器控件模式”;)

我们的想法仍然是使用ItemDataBound事件,但同时检查ItemAlternatingItem以及将DataItem强制转换为CustomerObject。然后我继续使用绑定到我在会话中存储的DataList的原始集合,并使用快速Find()来获取正确的对象。一旦缩小,我可以使用它的.Orders集合绑定到内部DataList.DataSource属性。它就像一个魅力:

protected void ui_dlst_ETLMainInformation_ItemDataBound(object sender, DataListItemEventArgs e)
{

   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      Customer c = e.Item.DataItem as Customer;
      DataList innerDataList = e.Item.FindControl("innerDataListControl") as DataList;

      List<Customers> customers = ((IList)Session["CustomersCollection"]).Cast<Customers>().ToList();

      Customer customer = customers.Find(ct => ct.ID == c.ID);

      innerDataList.DataSource = customer.Orders;
      innerDataList.DataBind();
    }
}