1

私のシナリオ:

ベース マスター (mdi) フォームを使用する Windows フォーム アプリケーション。

イベントを持つインターフェイス:

Public Interface IDoSomething

Event AddFilter()

モーダル ポップアップ ウィンドウは、インターフェイスとdecalres イベントを実装します。

Public Class frmPopup Implements IDoSomething

Public Event AddFilter() Implements IDoSomething.AddFilter

ポップアップには、イベントを発生させるコードも含まれています。

RaiseEvent AddFilter()

ベース マスター フォームには、指定されたインターフェイスを実装するポップアップ フォームを検出して起動するコードが含まれています。

アプリケーション内のフォームは、ポップアップ (インターフェースを実装する) を起動し、発生するイベントを処理します。したがって、フォームに次のコードがあります。

Public Class frmMyForm

Public WithEvents m_Popup As IDoSomething

Public Sub m_Popup_AddFilter() Handles m_Popup.AddFilter

    MsgBox("I'm in")

End Sub

イベントが発生する段階まで、コードはすべて機能しています。ポップアップは問題なく読み込まれますが、イベントが発生すると、地面から落ちたように見え、メイン フォーム (frmMyForm) によって取得されません。インターフェイスの検出を介してベースマスターフォームからポップアップフォームが起動される方法と関係があるのではないかと思います。

追加コード - 「ベース マスター フォームには、指定されたインターフェイスを実装するポップアップ フォームを検出して起動するコードが含まれています」を拡張するには:

使用されているポップアップ フォームの考え方は、イベントを使用してビジネス オブジェクトを開いたフォームに戻すことです。ポップアップ フォーム インターフェイス (IDoSomething) は、フォームがビジネス オブジェクトを返すことを指定する IBusinessObjectSelector という別のインターフェイスを継承します。

したがって、基本マスター フォームの関数は次のとおりです。

Public Function GetBusinessObjectUsingPopup(Of O, F As IBusinessObjectSelector)
               (ByRef dicPropertyValues As Dictionary(Of String, Object), 
                Optional ByVal titleText As String = "") 
                As O Implements IBaseMasterForm.GetBusinessObjectUsingPopup

Dim objBusinessObjectSelector As IBusinessObjectSelector = GetPopup(Of F)(False)       
    objBusinessObjectSelector.InitialiseForm()

    ' Activate and show the dialog
    If objBusinessObjectSelector.ShowPopup() <> Windows.Forms.DialogResult.OK Then
        ' The user cancelled the load, so just exit
        Return Nothing
    End If

    GetBusinessObjectUsingPopup = CType(objBusinessObjectSelector.SelectedBusinessObject, O)

End Function

そしてポップアップコード:

Public Function GetPopup(Of F As IBasePopupChildForm)
            (Optional ByVal initialisePopupPriorToReturn As Boolean = True) As F 
             Implements IBaseMasterForm.GetPopup

    Dim lstIBasePopupChildForm As List(Of F) = GetInterfaces(Of F)()
            lstIBasePopupChildForm(0).MyIBaseMasterForm = Me
    If initialisePopupPriorToReturn Then
        lstIBasePopupChildForm(0).InitialiseForm()
    End If
    Return lstIBasePopupChildForm(0)
End Function

注 - GetInterfaces(Of F)() は単にアセンブリをスキャンし、必要なインターフェイスを実装するフォームのリストを返します。インターフェイスを実装する複数のフォームが見つかった場合にメッセージを返すいくつかの検証が削除されました。

4

1 に答える 1

3

重要な部分は、m_Popup を正しく初期化することです。あなたはそれについて何も言っていません。サンプルコード:

フォーム2:

Public Class Form2
    Implements IDoSomething
    Public Event AddFilter() Implements IDoSomething.AddFilter

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

Public Interface IDoSomething
    Event AddFilter()
End Interface

フォーム1:

Public Class Form1
    Private WithEvents mPopup As IDoSomething

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim f2 As New Form2
        f2.Show(Me)
        mPopup = f2
    End Sub

    Private Sub mPopup_AddFilter() Handles mPopup.AddFilter
        MsgBox("yada")
    End Sub
End Class

このコードの mPopup = f2 ステートメントが重要です。

于 2009-02-17T17:17:47.120 に答える