Мой сценарий:
Приложение Windows Forms с базовой формой master (mdi).
Интерфейс, который имеет событие:
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) () просто сканирует сборку и возвращает список форм, реализующих требуемый интерфейс. Была отключена некоторая проверка, которая возвращает сообщения, если найдено несколько форм, реализующих интерфейс.