设置asp转发器数据源

时间:2009-11-02 15:35:30

标签: asp.net

我在aspx页面中有一个asp.net转发器控件,其中有runat =“server”和一个id设置,但由于某些原因我无法从后面的代码中访问它的ID(我可以访问asp的id :detaislview控制它坐在其中)。因此,在page_load方法中,我正在执行以下操作:

Repeater repeater = (Repeater)PromotionSitesDetailsView.FindControl("estateRepeater");
repeater.DataSource = estateList;

然而,当运行时,出现错误,说转发器为空!我想要做的就是将此转发器的数据源设置为List对象。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你说Repeater位于DataList中。 DataList本身就是一种转发器 - 在DataList绑定到数据源之前,它内部的控件不存在,并且模板中的控件在源中的每个项目中创建一次。因此,如果将DataList绑定到包含3个项目的源,则将获得3个中继器。

所以它看起来像这样:

Page
    MyDataList
        Item0
            MyRepeater
        Item1
            MyRepeater
        Item2
            MyRepeater

显然MyDataList.FindControl("MyRepeater")无法正常工作 - 我们在谈论哪个“MyRepeater”?由于多个控件不能具有相同的ID,因此ASP.NET通过将ID唯一称为NamingContainer来解决此问题。由于DataList多次重复相同的控件集(数据源中每个项目一次),因此DataList中的每个项都是NamingContainer。

我们需要找到我们知道的NamingContainer,它包含我们想要的MyRepeater实例:

MyDataList.Items[0].FindControl("MyRepeater");

您可以在绑定后迭代DataList中的项目(当然,在绑定之前它没有项目)。您还可以在创建该项目时对DataList中的给定项目进行操作:

<asp:DataList OnItemDataBound="MyDataList_HandleItemDataBound" ... />

//this will get called once per item as it is created
void MyDataList_HandleItemDataBound(object sender, DataListItemEventArgs e)
{
    //e.Item is the current item being databound
    Repeater myRepeater = e.Item.FindControl("MyRepeater") as Repeater;
    myRepeater.DataSource = //ds
    myRepeater.DataBind();
}

答案 1 :(得分:0)

只需指定转发器DataSource,即可完成此操作,无需代码隐藏。以下是两级分层菜单的示例:

<ul>
<asp:Repeater ID="ctlMenu" runat="server">
    <ItemTemplate>
        <li>
        <asp:HyperLink runat="server"
            NavigateUrl='<%#(Container.DataItem as MyPage).GetUrl()%>'
            Text="<%# (Container.DataItem as MyPage).GetName() %>"></asp:HyperLink>
        <ul>
        <asp:Repeater runat="server" DataSource="<%# (Container.DataItem as MyPage).GetChildren() %>">
            <ItemTemplate>
                <li>
                <asp:HyperLink runat="server"
                    NavigateUrl='<%#(Container.DataItem as MyPage).GetUrl()%>'
                    Text="<%# (Container.DataItem as MyPage).GetName() %>"></asp:HyperLink>
                </li>
            </ItemTemplate>
        </asp:Repeater>
        </ul>
    </ItemTemplate>
</asp:Repeater>
</ul>