0

親フォームに関数を実装しようとしています。イベントが発生したときに、開いているすべての子フォームでアクションを実行したいと考えています。特定の子フォームは特定の時間に開いている場合と開いていない場合があるため、親フォームのイベントから直接処理することはできません。

--Parent Form--
Public Sub ParentEvent()
    DoParentAction()
    DoChild1Action()
    DoChild2Action()
End Sub

各子ページで ParentEvent() が発生するのをリッスンする方法はありますか? 基本的に、私がやりたいことは、子ページでボタンがクリックされた場合と同じように、子ページで発生する ParentEvent() を次のように処理することです。

--Child1--
Public Sub ChildEvent() Handles ParentForm.DoParentAction()
    DoChild1Action()
End Sub
4

2 に答える 2

6

これは簡単に行うことができます。VBWithEventsHandles構文をステップ実行するだけで取得できます。

Public Class ParentForm
    Event OnDoSomething()

    Private Sub DoSomething()
         RaiseEvent OnDoSomething()
    End Sub
End Class

その後

Public Class ChildForm
   Public Sub New()
        InitializeComponent()
        AddHandler ParentForm.OnDoSomething, AddressOf DoSomething
    End Sub

    Private Sub DoSomething()
        ' do something
    End Sub

    Private Sub ChildForm_FormClosing(ByVal sender As System.Object, _
                ByVal e As System.Windows.Forms.FormClosingEventArgs) _
                Handles MyBase.FormClosing
        RemoveHandler ParentForm.OnDoSomething, AddressOf DoSomething
    End Sub
End Class

子フォームを破棄する前に、イベント ハンドラーが削除されていることを常に確認することが重要です (そうしないと、メモリ リークが発生します)。

上記は、VB の既定のインスタンスを使用していることを前提としていParentFormます。そうでない場合は、それに応じて参照する必要があります。より良いアプローチは、次のように親をコンストラクターの引数にすることです。

 Public Sub New(ByVal parent as ParentForm)
    InitializeComponent()
    AddHandler parent.OnDoSomething, AddressOf DoSomething
 End Sub  

もちろん、RemoveHandlerセクションも変更します (親への参照を保持する必要があります)。ParentChangedもう 1 つのオプションは、これが MDI アプリケーションの場合、イベントでフック/アンフックすることです。

他の唯一の注意点は、構築中に自己参照になってしまうため、親フォームのコンストラクターで子フォームを作成できないことです。

于 2013-05-02T16:31:13.077 に答える