2013-11-14 66 views
1

我已經看到(3)在ASP.NET中使用嵌套的DataList或Repeater的不同示例,但都使用原始DataTable/DataSetCreateChildView調用的組合來創建關係在外部和內部之間DataList如何使用屬性集合綁定到嵌套的DataList

好,因爲它是2013,而不是2003年,我有以下結構的類:

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

的想法是,Orders收集什麼必然的DataSource內,嵌套DataList。問題是我似乎無法弄清楚如何在綁定的代碼中設置關係。內部DataList實際上是而不是,它通過Intellisense直接在代碼中訪問,因爲它嵌套在主DataList下。下面是在ItemDataBound事件典型的代碼,以查找內部DataList並分配DataSource使用CreateChildView:在我看到的是建立像所有的例子

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(); 
    } 
} 

「OrdersRelation」以下內容:

// 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綁定到我的Orders集合屬性?

回答

0

我明白了這一點;只是花了一點找回在OLE」 ASP.NET服務器控件模式;)

的想法是與鑄造DataItemCustomerObject沿着仍然使用ItemDataBound事件,但檢查兩個ItemAlternatingItem。然後我開始使用綁定到我在會話中存儲的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(); 
    } 
}