2009-02-17 14 views
1

我的場景:從界面中提取事件(獲勝表單)

帶有基礎主(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)()僅僅掃描組件,並返回一個列表實現所需接口的表單。如果找到多個實現該接口的表單,則會發出一些驗證信息,該信息將返回消息。

回答

3

關鍵部分正確初始化m_Popup。你還沒有說過這些。一些示例代碼:

窗體2:

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 2009-02-18 09:26:09