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 を明示的にデータ バインドしようとしましたが、毎回、Items または Text 値を取得しませんでした。
マスターページのないページで、過去にほぼ同じ設定を行ったことがあります。また、Page_Init または Page_Load で true に設定しても、submit_Click メソッドで this.Master.EnableViewState が false であることにも気付きました。this.EnableViewState は true です。