Мой сценарий:Поднятие событий из интерфейса (формы выигрыша)
Приложение Windows Forms с базой master (mdi).
интерфейс, который имеет событие:
Public Interface IDoSomething
Event AddFilter()
режимное всплывающее окно реализует интерфейс и decalres событие:
Public Class frmPopup Implements IDoSomething
Public Event AddFilter() Implements IDoSomething.AddFilter
Popup также содержит код активаций события:
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
И Popup Код:
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)() просто сканирует сборку и возвращает список формы, которые реализуют требуемый интерфейс. Некоторая проверка была прервана, что возвращает сообщения, если найдено несколько форм, реализующих интерфейс.
Спасибо за ваш ответ, я добавил дополнительный код выше, чтобы попытаться показать, как запускается всплывающее окно, и, надеюсь, оно немного улучшится. – Tanner
Я все еще не вижу, как вы назначаете член m_Popup. –
Чтобы обновить информацию о прогрессе, ваш комментарий о назначении m_Popup действителен и нет возврата к первоначальной форме открытия, чтобы связать события вверх. В настоящее время он рассматривается как ошибка, поэтому, когда я доберусь до него и внедрю исправление, я обновляю проводку и оцениваю вас. благодаря – Tanner