6

メインフォームのダイアログとして使用されるVB.NETのフォームがあります。そのインスタンスは常にローカルで定義されており、そのためのフィールドはありません。ユーザーがダイアログの[OK]ボタンをクリックすると、1つの引数、つまり私のクラスの1つのインスタンスでイベントが発生します。

これは常にローカル変数であるため、そのイベントのイベントハンドラーを追加するにはどうすればよいですか?私は自分自身を探して何かを見つけましたが、それを本当に理解することはできません...

イベントのコード、次のフィールドMyDialog

public Event ObjectCreated(ByRef newMyObject as MyObject)

ダイアログを呼び出すメインフォームのコード:(構文は気にしないでください)

Dim dialog As New MyDialog()
dialog.ShowDialog(Me)
AddHandler ObjectCreated, (what do I put here?) //Or how do I add a handler?

ご覧のとおり、イベントのハンドラーを追加する方法に固執しています。誰か助けてもらえますか?できればそれを行うための最良の方法で...

4

2 に答える 2

6

一貫性を保つために、すべてのシステムイベントハンドラーと同じソースおよびイベント引数モデルを使用することをお勧めします。

次のように、EventArgsから継承する独自のクラスを作成します。

Public Class MyObjectEventArgs
    Inherits EventArgs

    Public Property EventObject As MyObject

End Class

次に、イベントと、次のようなハンドラーメソッドを宣言します。

Public Event ObjectCreated As EventHandler(Of MyObjectEventArgs)

Private Sub Container_ObjectCreated(ByVal sender As Object, ByVal e As MyObjectEventArgs)
    ' Handler code here
End Sub

次に、以下を使用してハンドラーをイベントにアタッチします。

AddHandler ObjectCreated, AddressOf Container_ObjectCreated

さらに、以下のように、を使用しHandlesてメインフォームから発生したイベントにアタッチできます(MainFormという名前を想定)。

Private Sub MainForm_ObjectCreated(ByVal sender As Object, ByVal e As MyObjectEventArgs) Handles MainForm.ObjectCreated
    ' Handler code here
End Sub
于 2012-04-25T16:04:52.490 に答える
1

イベントが生成されたときに実際に実行されるサブルーチンを作成する必要があります。

public Sub OnObjectCreated(ByRef newMyObject as MyObject)
   ...
End Sub

次に、ハンドラーが追加されます。

AddHandler ObjectCreated, AddressOf OnObjectCreated

ちなみに、ByRefはここでは何もしません。VB内のすべてのオブジェクトは参照によって渡されます。デフォルトでは、primitave変数(string、intなど)のみがByValを使用し、ByRefに設定できます。

于 2012-04-25T16:14:28.747 に答える