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

ASP.NET ユーザーコントロール(ascx)内のイベントを親側で検知する

例えばユーザーコントロールの中にボタンがあり、そのボタンがクリックされたときに組み込み元の親コントロール側の処理を実行したい場合があります。

いろいろと方法はありますが、ユーザーコントロール側でイベントをPublicで宣言する方法がわかりやすいです。

以下のようなユーザーコントロールがあるとします。

UserControl1.ascx
<asp:Button ID="Button1" runat="server" />

ボタンのクリックイベントで、Publicで宣言したイベントを実行します。

UserControl1.ascx.vb
Public Class UserControl1
    Inherits System.Web.UI.UserControl

    Public Event Button1Click As EventHandler

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent Button1Click(Me, e)
    End Sub
End Class

親コントロール側では上記で作成したascxを組み込んでいます。

WebForm1.aspx
<uc:UserControl1 ID="UserControl1" runat="server"></uc:UserControl1>

以下のように、ユーザーコントロールのイベントとして親コントロール側で処理を実装できます。

WebForm1.aspx.vb
Protected Sub UserControl1_Button1Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UserControl1.Button1Click
    '処理を実装
End Sub

Commandイベントの場合

コマンドイベントでも基本的には方法は同じです。

UserControl1.ascx.vb
Public Class UserControl1
    Inherits System.Web.UI.UserControl

    Public Event Button2Click As EventHandler

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As CommandEventArgs) Handles Button2.Command
      RaiseEvent Button2Click(Me, e)
    End Sub
End Class

パラメーターeの型はSystem.EventArgsでないとエラーになってしまうので、System.EventArgsで受け取ったあとに、CommandEventArgsに型変換して値を取得します。

WebForm1.aspx.vb
Protected Sub UserControl1_Button2Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UserControl1.Button2Click
    'コマンドのパラメーターは型変換して参照できます
    Dim args As String = CType(e, CommandEventArgs).CommandArgument.ToString
End Sub

関連記事