私のシナリオ:
ベース マスター (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)() は単にアセンブリをスキャンし、必要なインターフェイスを実装するフォームのリストを返します。インターフェイスを実装する複数のフォームが見つかった場合にメッセージを返すいくつかの検証が削除されました。