Repeater.Item仅在该事件中的DataBind中填充Button click事件,但所有文本框输入都为空

时间:2013-05-17 21:14:05

标签: textbox repeater webforms

我有一个数据绑定到SqlDataSource的转发器

    <asp:Repeater runat="server" ID="Repeater" DataSourceID="SqlDataSource">
        <ItemTemplate>
            <asp:HiddenField runat="server" Value='<%# Eval("Code") %>' ID="Code" />
            <asp:TextBox ID="NumberNeeded" runat="server" Text='<%# Eval("Needed") %>' /><br />
        </ItemTemplate>
    </asp:Repeater>
    <asp:Button runat="server" ID="submit" Text="submit" OnClick="submit_Click" />
    <asp:SqlDataSource ID="SqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="rtvFiltered" SelectCommandType="StoredProcedure">
        <SelectParameters>
        </SelectParameters>
    </asp:SqlDataSource>

我想迭代转发器并在submit_Click

中获取NumberNeeded中的值
protected void submit_Click(object sender, EventArgs e)
{
    this.Repeater.DataBind(); //comment this guy and this.Repeater.Items has no items
    foreach (RepeaterItem item in this.Repeater.Items)
    {
        String code = ((HiddenField)item.FindControl("JournalCode")).Value;
        // below fails because "NumberNeeded" control doesn't have the Text input by the user.
        int numNeeded = Int32.Parse(((TextBox)item.FindControl("NumberNeeded")).Text);

        // Doing other stuff with numNeeded
    }
}

转发器在页面上完美地显示其项目,但是当我单击提交按钮时,this.Repeater.Items为空(除非我在该方法中调用this.Repeater.DataBind())。

我已经在Page_Load和Page_Init中明确地尝试了数据绑定Repeater!在Page.IsPostBack检查内外,每次我没有获得Items或没有Text值。

我在过去没有母版页的页面上得到了几乎相同的设置。我也注意到,无论是否在Page_Init或Page_Load中将它设置为true,this_Master.EnableViewState在submit_Click方法中都是false。 this.EnableViewState为true。

2 个答案:

答案 0 :(得分:2)

正如您所说,您不需要在代码中调用DataBind(),因此问题可能出在数据检索上。您的存储过程是否采用任何参数?您是否尝试将CancelSelectOnNullParameter="false"添加到SqlDataSource?

答案 1 :(得分:1)

这是母版页上的EnableViewState设置。

在母版页的Page_Load方法中,this.EnableViewState被设置为false。我将其更改为Page.EnableViewState,一切正常。

this.EnableViewState = Page.EnableViewState; // add to Master page Page_Load method

do'h