我在aspx页面中有一个asp.net转发器控件,其中有runat =“server”和一个id设置,但由于某些原因我无法从后面的代码中访问它的ID(我可以访问asp的id :detaislview控制它坐在其中)。因此,在page_load方法中,我正在执行以下操作:
Repeater repeater = (Repeater)PromotionSitesDetailsView.FindControl("estateRepeater");
repeater.DataSource = estateList;
然而,当运行时,出现错误,说转发器为空!我想要做的就是将此转发器的数据源设置为List对象。有什么想法吗?
答案 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>