zukucode
主にWEB関連の情報を技術メモとして発信しています。

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>

正しく非同期ポストバックを行うにはScriptManagerRegisterAsyncPostBackControlで非同期ポストバックするコントロールとして登録する必要があります。

また、登録するのは初回だけではなくサーバー処理の度に毎回行う必要があります。

以下のようにRepeaterのバインドが完了したあとに登録処理を行います。

Load完了後のLoadCompletePreRenderなどのイベントで行うようにしておけば実装漏れは防げます。

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

関連記事