我已经看过(3)在ASP.NET中使用嵌套DataList
或Repeater的不同示例,但都使用原始DataTable/DataSet
和CreateChildView
调用的组合来创建外部和内部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
集合属性?
答案 0 :(得分:0)
我想出来了;刚刚回过头来讨论“ASP.NET服务器控件模式”;)
我们的想法仍然是使用ItemDataBound
事件,但同时检查Item
和AlternatingItem
以及将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();
}
}