ASP.NET Repeater内のコントロールのイベントに非同期ポストバックの設定をする
Repeater
の中に定義したコントロールはUpdatePanel
で設定しても同期ポストバックが行われてしまい、動作が不安定になります。
自分の場合は、ページ全体の同期ポストバックがされたり、非同期ポストバックがされたりとよくわからない動作になってしまいました。
以下のようにRepeater
内にテキストボックスとボタンを配置し、それぞれにイベントを定義しているとします。
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" />
</ItemTemplate>
</asp:Repeater>
正しく非同期ポストバックを行うにはScriptManager
のRegisterAsyncPostBackControl
で非同期ポストバックするコントロールとして登録する必要があります。
また、登録するのは初回だけではなくサーバー処理の度に毎回行う必要があります。
以下のようにRepeater
のバインドが完了したあとに登録処理を行います。
Load
完了後のLoadComplete
やPreRender
などのイベントで行うようにしておけば実装漏れは防げます。
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
'ページに組み込まれているScriptManagerを取得
Dim sm As ScriptManager = ScriptManager.GetCurrent(Me.Page)
'Repeater内のコントロールをすべて登録
For Each item As RepeaterItem In Repeater1.Items
sm.RegisterAsyncPostBackControl(item.FindControl("TextBox1"))
sm.RegisterAsyncPostBackControl(item.FindControl("Button1"))
Next
End Sub