3

にボタンがありUserControl1ます。で使用UserControl1していForm1ます。ButtonのClickイベントをで処理したいForm1

私は次の方法で同じことをしようとしました:

AddHandler userControl1.Button1.Click, AddressOf Button1_Click

と:

Public Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs) Handles userControl1.Button1.Click

End Sub

しかし、エラーが発生します。

4

2 に答える 2

10

でイベントを作成しますUserControl:

Public Class UserControl1

    Public Event UC_Button1Click()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent UC_Button1Click()
    End Sub

End Class

そして、新しいイベントを使用します:

AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click

または、 で次のように定義しUserControlて、外部からアクセスすることもできます (推奨されません)。

Public WithEvents Button1 As System.Windows.Forms.Button

その後:

AddHandler uc.Button1.Click, AddressOf Button1_Click
于 2013-01-30T12:37:27.623 に答える
0

「AddHandler」をメインプログラム(UserControlではなく)に配置するまで、これは非常に混乱していました。

明確にするために、ユーザーコントロールで発生したイベントをメインプログラムで「感知」できるようにするための手順は次のとおりです。

  1. プロパティを変更するユーザー コントロール内のオブジェクト (PictureBox.Image や TextBox.Text など) の修飾子プロパティが "Public" に設定されていることを確認します。これは、他のプログラムがプロパティを変更できるようにする唯一の方法です。

  2. 認識したいイベント (例: "Click"、"DblClick" など) については、ユーザー コントロール コードの先頭にパブリック イベントの 1 つの宣言行を配置します。例として、

         Public Event UC_MySub(.....parameters.....)
    

「UC_」は、「UserControl」で定義されていることを強調するために使用するプレフィックスです。名前の残りの部分 (「MySub」) は何でも構いませんが、クリック イベントに関連付ける必要はありません。必要に応じて、「CreamedCheese」と呼ぶこともできます。パブリック イベントの定義に好きなパラメータを含めます。ここでも、任意のタイプの名前にすることができます。これらは、ユーザー コントロールのオブジェクトをクリックすると、メイン プログラムに渡されます。

  1. ここで、GroupBox (この場合) を「クリック」したときに実行されるイベントに移動し、次に示すようにその公開イベントを開始します。

    Private Sub GroupBox_Click(sender As Object, e As EventArgs) Handles GroupBox1.Click
           RaiseEvent UC_MySub(....Paramaters.....)
    End Sub
    

このパブリック イベントへの呼び出しで渡されるパラメーターの数 (および型) が、パブリック イベント宣言自体で定義されている各パラメーターと同じであることを確認する必要があります。

  1. ここで、ユーザー オブジェクトを再構築してから、メイン プログラムに移動します。メイン フォームの「読み込み」ルーチンで、使用しているユーザー定義オブジェクトの次の行 FOR EACH OBJECT を追加します。たとえば、私のプログラムには、UDO (ユーザー定義オブジェクト) の 4 つのインスタンスがあります。したがって、追加しました (UDO の名前が「MyUDO」であると仮定します):

     AddHandler MyUDO1.UC_MySub, AddressOf SwapHands 'This is my sub accepting the values from the public event
     AddHandler MyUDO2.UC_MySub, AddressOf SwapHands
     AddHandler MyUDO3.UC_MySub, AddressOf SwapHands
     AddHandler MyUDO4.UC_MySub, AddressOf SwapHands
    

「SwapHands」ルーチンはメイン プログラムで定義され、UC Public イベントに格納されたパラメーターを受け入れます。「AddressOf」は常駐サブルーチンを指します。これらすべての定義で確実にする唯一のことは、各ケースで同じ数のパラメーター (ある場合) を同じ順序で同じ型にすることです)。(各パラメーターは異なる型にすることができますが、各定義で宣言された型に「並べる」必要があります)。(例: 1 つのブール値、1 つの文字列、別の文字列)。定義と呼び出しでは、(この場合)「ブール値、文字列、文字列」の 3 つのパラメーターが必要です。この順序で。

プログラムを実行し、UDO (ユーザー定義オブジェクト) (この場合は 4 つのオブジェクトのいずれか) の GroupBox (または使用したもの) をクリックすると、メイン プログラムに保存されているルーチンが開始されます。 .

説明するのは難しいですが、これがどのように機能するかを理解するのに何時間も費やした後、他の人が同じ混乱を経験している場合に備えてコメントを残しておくことにしました.

于 2020-08-10T13:44:14.890 に答える