【问题标题】:Passing event to the parent form将事件传递给父表单
【发布时间】:2014-02-04 21:40:20
【问题描述】:

我这里有个小问题。我正在尝试将拥有的表单的事件转移/传递/提高给他的父母。让我们看看我的例子:

假设我有一个初始化 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

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

【问题讨论】:

    标签: vb.net winforms events


    【解决方案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
    

    【讨论】:

    • 很抱歉,我从未使用过 RaiseEvent,您能否指定或链接一个页面来解释如何使用它?
    • 好的,但是就像我说的那样,我不能这样修改父表单,因为面板可以动态添加,并且面板也可以有自己的孩子。
    • 如果您可以修改表单代码以添加动态调用以添加面板,那么您可以添加处理事件的委托子。否则你的运气不好。
    • 好的,感谢您的快速答复。也许我应该让一个面板“点击”。
    • 这个功能的目的是什么?
    【解决方案2】:

    在子窗体上

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2020-01-15
      • 2011-09-11
      • 2023-04-06
      相关资源
      最近更新 更多