2009-02-17 2 views
1

Мой сценарий:Поднятие событий из интерфейса (формы выигрыша)

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

ответ

3

Критическая часть инициализирует 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 утверждение в этом коде является ключевым фактором.

+0

Спасибо за ваш ответ, я добавил дополнительный код выше, чтобы попытаться показать, как запускается всплывающее окно, и, надеюсь, оно немного улучшится. – Tanner

+0

Я все еще не вижу, как вы назначаете член m_Popup. –

+0

Чтобы обновить информацию о прогрессе, ваш комментарий о назначении m_Popup действителен и нет возврата к первоначальной форме открытия, чтобы связать события вверх. В настоящее время он рассматривается как ошибка, поэтому, когда я доберусь до него и внедрю исправление, я обновляю проводку и оцениваю вас. благодаря – Tanner

Смежные вопросы