绑定控件内的ASP.Net数据绑定

时间:2011-10-26 14:39:32

标签: asp.net data-binding

今天我对ASP.Net数据绑定有了一个小小的乐趣,基本上我有两个嵌套控件,以及一个带有我们希望绑定的内部集合的对象集合......

所以,说我正在使用这样的两个中继器 - >

    <asp:Repeater ID="Repeater1">
      <ItemTemplate>
        <asp:Label runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "HeaderText")%>'>
        </asp:Label>
        <asp:Repeater ID="Repeater2">
          <asp:Label runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DetailText")%>'>
          </asp:Label>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>

我的对象看起来像这样:

    public class parent
    {
      public string HeaderText {get;set;}
      public List<child> children {get;set;}
    }
    public class child
    {
      public string DetailText {get;set;}
    }

如何绑定内部中继器?我猜我需要设置&amp;将aspx中某处的'Repeater2'的数据源绑定为'parent'的'children'属性?

有人能指出我正确的方向吗?

由于

2 个答案:

答案 0 :(得分:1)

将嵌套转发器绑定在主转发器ItemDataBound事件中。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

在这里你可以找到控件(FindControl)并绑定它。

这将是:

<asp:Repeater ID="Repeater1" OnItemDataBound="Repeater1_ItemDataBound">


void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
    Repeater Rep2 = e.Item.FindControl("Repeater2");
    Rep2.DataSource = //datasource here
    Rep2.DataBind();         
}    

答案 1 :(得分:1)

您可以在外部转发器的ItemDatabound事件中绑定内部转发器:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Repeater innerRepeater = e.Item.FindControl("InnerRepeater1") as Repeater;
    if (innerRepeater != null)
    {
        innerRepeater.DataSource = GetSomeData();
        innerRepeater.DataBind();
    }
}

如果需要使用外部数据绑定控件中的数据来绑定内部数据绑定控件,可能更容易使用ListViewDataList,因为您可以指定datakeys。

<asp:ListView ID="ListView1" runat="server" DataKeyNames="SomeColumn" ...>

代码隐藏:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    ListView innerList = e.Item.FindControl("InnerList1") as ListView;
    if (innerList != null)
    {
        innerList.DataSource = GetSomeData((int)ListView1.DataKeys[ListView1.Items.IndexOf(e.Item)]["SomeColumn"]);
        innerList.DataBind();
    }
}