【问题标题】:How to bind to a nested DataList using a property collection如何使用属性集合绑定到嵌套 DataList
【发布时间】:2013-11-14 20:15:39
【问题描述】:

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

好吧,既然是 2013 年而不是 2003 年,我有一个具有以下结构的类:

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

这个想法是Orders 集合是绑定为DataSource 用于嵌套 DataList。问题是我似乎无法弄清楚如何在绑定代码中设置关系。内部 DataList 实际上不能通过 Intellisense 在代码中直接访问,因为它嵌套在主 DataList 下。这是ItemDataBound 事件中的典型代码,用于查找内部DataList 并使用CreateChildView 分配其DataSource

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 集合属性?

【问题讨论】:

    标签: c# asp.net datalist


    【解决方案1】:

    我想通了;只是花了一点时间才回到原来的 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多