2009-02-17 15 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