6

我有一个数据绑定到 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.IsPostBack 检查内外的 Page_Load 和 Page_Init 中显式地数据绑定Repeater,每次我要么没有得到任何项目,要么没有得到文本值。

过去,我在没有母版页的页面上获得了几乎相同的设置。我还注意到 this.Master.EnableViewState 在 submit_Click 方法中为 false,无论我在 Page_Init 还是 Page_Load 中将其设置为 true。this.EnableViewState 为真。

4

2 回答 2

2

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

于 2013-05-20T14:09:39.010 回答
1

这是母版页上的 EnableViewState 设置。

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

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

于 2013-05-20T17:58:08.697 回答