我有一个带有以下转发器的ASP页面:
<asp:Repeater runat="server" ID="RegionRepeater"
DataSourceID="SqlDataSourceRegions" EnableViewState="true">
<ItemTemplate>
<tr>
<td valign="top">
<b><%#Eval("description")%></b>
<asp:HiddenField runat="server" ID="RegionID"
Value='<%#Eval("region_id")%>'/>
</td>
<td>
<asp:FileUpload ID="FileUpload" runat="server" Width="368px" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
(转发器位于向导内部,位于内容窗格内)。
后面的代码连接到
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
事件。屏幕上有两个项目(表格内有两行)。但是,当代码尝试读取这些项时,Items集合为空!
foreach(RepeaterItem region in RegionRepeater.Items)
{
// Never runs - the RegionRepeater.Items.Count = 0
FileUpload fileUpload = (FileUpload) region.FindControl("FileUpload");
String regionID = ((HiddenField)region.FindControl("RegionID")).Value;
...
当屏幕上绘制了控件时,为什么集合为空?
非常感谢任何帮助;这开始让我疯狂。
(顺便说一句:我尝试添加/删除EnableViewState =“true”标签)
答案 0 :(得分:5)
你确定转发器已经在回发中反弹了吗?
ASP.NET Page Life Cycle表示在回发时,您需要重新绑定控件,如转发器,以便事件处理程序能够查看数据。
答案 1 :(得分:2)
检查后面的页面代码中是否有Page.DataBind()
。这使得转发器与空数据绑定。
答案 2 :(得分:1)
也许你每次加载页面时都会进行数据绑定,在你这样做之前是否检查过没有postbacl?
答案 3 :(得分:1)
我相信Items只在绑定时才会填充。因此,您必须在每次页面加载时重新绑定数据。这是由于网络的无静态环境;它不记得数据源,但从视图状态加载已绑定到它的创建控件。
因此,在后续请求中,它会加载控件层次结构,但对创建UI的数据源一无所知,除非您再次重新绑定。
HTH。