代码之家  ›  专栏  ›  技术社区  ›  Tanner

从接口引发事件(win表单)

  •  1
  • Tanner  · 技术社区  · 17 年前

    我的设想:

    Public Interface IDoSomething
    
    Event AddFilter()
    

    模式弹出窗口实现界面和贴花事件:

    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
    

    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 回复  |  直到 12 年前
        1
  •  3
  •   Hans Passant    17 年前

    关键部分是正确初始化m_弹出窗口。你还没说过什么。一些示例代码:

    表格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
    

    表格1:

    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语句是键。

    推荐文章