Возбуждение событий из интерфейса (формы выигрыша) - PullRequest
1 голос
/ 17 февраля 2009

Мой сценарий:

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

1 Ответ

3 голосов
/ 17 февраля 2009

Критическая часть правильно инициализирует m_Popup. Вы ничего не сказали об этом. Пример кода:

Form2:

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

Form1:

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 в этом коде является ключевой.

...