将事件传递给父表单

时间:2014-02-04 21:40:20

标签: vb.net winforms events

我这里有点问题。我正在尝试将自有表格的事件转移/传递/提升给他的父母。让我们看看我的例子:

假设我有一个初始化CustomPanel的表单(只是一个继承自System.Windows.Forms.Panel的类)。它还有一个事件处理程序(它可能是另一个事件,不一定是单击事件):

Public Sub New()
    Me.Size = New Size(1000,1000)

    Dim pnl1 As New CustomPanel()
    pnl1.Location = New Point(0,0)
    pnl1.size = New Size(100,100)
    Me.Controls.Add(pnl1)
End Sub

Private Sub form1_Click(sender As Object, e As EventArgs) Handles Me.Click
    MsgBox("I got it!")
End Sub

我做了类似的事情,当我点击CustomPanel(pnl1)时,父容器(form1)没有收到点击事件......这是可以理解的。我试图查看CustomPanel(pnl1)的属性,如果我能找到一些有趣的东西,如“点击”或“将事件提升到父母”(我在这里绝望),但没有成功。我说没问题,我将处理我需要传递给CustomPanel类中父节点的事件,但我不能在这里找到解决方案:

Imports System.Windows.Forms

Public Class CustomPanel
    Inherits Panel

    Public Sub New()

    End Sub

    Private Sub CustomPanel_Click(sender As Object, e As EventArgs) Handles Me.Click
        'What to put here?
        'Me.Parent.?
    End Sub

End Class

我只想知道是否有可能将事件抛出/引发/传递给父母。有一点是肯定的,它是我不应该的,我不能在父表单中添加任何其他内容。原因很简单,我可以在这个父表单中有超过100个控件,它们可以动态添加。最重要的是,这些控件也可以在内部拥有自己的控件!所以我可以有类似的东西:

pnl99 call parent click -> pnl98 call parent click -> ... until the parent of the control really handle the click event ... -> form1 perform click event

也许很难理解,但如果你能帮助我,我会很感激。

2 个答案:

答案 0 :(得分:1)

使用自定义事件,拥有该面板的表单订阅。 Raise Event

Public Sub New()
 Me.Size = New Size(1000,1000)

 Dim pnl1 As New CustomPanel()
 pnl1.Location = New Point(0,0)
 pnl1.size = New Size(100,100)
 Addhandler pnl1.MyClickEvent, AddressOf pl_Click
 Me.Controls.Add(pnl1)
End Sub

Private Sub pl_Click()
 MsgBox("I got it!")
End Sub

自定义面板:

Public Class CustomPanel
 Inherits Panel
 Public Event MyClickEvent

 Private Sub CustomPanel_Click(sender As Object, e As EventArgs) Handles Me.Click
   RaiseEvent MyClickEvent()
 End Sub

End Class

答案 1 :(得分:0)

在儿童表格上

Imports System.Windows.Forms
Imports STAS_PLC_Link_Lib

Public Class ChildForm

    Public Event MyClick()
'.....rest of code

在父表单上

Public Class ParentForm

Private Sub GetSomeClick() Handles ChildFor.MyClick
        System.Console.WriteLine("test")
    End Sub
end Class