当控件在屏幕上时,为什么ASP.NET Repeater.Items集合为空?

时间:2010-02-24 12:39:22

标签: asp.net repeater

我有一个带有以下转发器的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”标签)

4 个答案:

答案 0 :(得分:5)

你确定转发器已经在回发中反弹了吗?

ASP.NET Page Life Cycle表示在回发时,您需要重新绑定控件,如转发器,以便事件处理程序能够查看数据。

答案 1 :(得分:2)

检查后面的页面代码中是否有Page.DataBind()。这使得转发器与空数据绑定。

答案 2 :(得分:1)

也许你每次加载页面时都会进行数据绑定,在你这样做之前是否检查过没有postbacl?

答案 3 :(得分:1)

我相信Items只在绑定时才会填充。因此,您必须在每次页面加载时重新绑定数据。这是由于网络的无静态环境;它不记得数据源,但从视图状态加载已绑定到它的创建控件。

因此,在后续请求中,它会加载控件层次结构,但对创建UI的数据源一无所知,除非您再次重新绑定。

HTH。