我的場景:從界面中提取事件(獲勝表單)
帶有基礎主(mdi)窗體的Windows窗體應用程序。
具有事件的接口:
Public Interface IDoSomething
Event AddFilter()
模式彈出窗口來實現接口和decalres事件:
Public Class frmPopup Implements IDoSomething
Public Event AddFilter() Implements IDoSomething.AddFilter
彈出還包含的代碼觸發事件:
RaiseEvent AddFilter()
基本主窗體包含代碼,用於發現並啓動實現a的彈出窗體指定的接口。
應用程序中的表單啓動彈出窗口(實現接口)並處理它觸發的任何事件。所以我在表格中有以下代碼:
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拾取。我懷疑它可能與通過發現界面從基礎主表單啓動彈出窗體的方式有關。
額外的代碼 - 擴大對「基地主窗體中包含的代碼,發現並啓動實現指定接口的彈出形式」:
的正在使用彈出窗口形式的想法是返回一個業務對象使用事件打開它的表單。彈出窗體Interface(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)()僅僅掃描組件,並返回一個列表實現所需接口的表單。如果找到多個實現該接口的表單,則會發出一些驗證信息,該信息將返回消息。
感謝您的回覆,我已經在上面添加了一些額外的代碼,試圖展示彈出窗口是如何啓動的,希望能夠使它更清晰。 – Tanner 2009-02-18 09:26:09