需要通过动态创建的事件处理程序传递对象

Need to pass object through dynamically created event handler

需要通过 vb.net 应用程序中动态创建的事件处理程序传递对象,(newperson 是一个用户控件)。事件处理程序:

AddHandler newperson.MouseUp, AddressOf newperson_MouseUp

然后我使用这个处理程序如下,

Private Sub newperson_MouseUp()

End sub

但我需要在这个子目录中提及新人,例如

newperson.Background = Brushes.Black

任何意见或想法将不胜感激:)。

你需要三样东西:

  1. 自定义 EventArgs class 存储对 newPerson 对象的引用

    Public Class MyMouseUpEventArgs
        Inherits MouseEventArgs
    
    Public Sub New(newPerson As Person, b As MouseButtons, clicks As Integer, x As Integer, y As Integer, Delta As Integer)
        MyBase.New(b, clicks, x, y, Delta)
        Me.newPerson = newPerson
    End Sub
    
    Public Property newPerson As Person
    End Class
    

    它继承自 MouseEventArgs,也有默认的事件参数,但这不是必须的。

  2. 在您的自定义控件中,您需要处理原始的 MouseUp 事件。在此处理程序中,您只需引发一个新的自定义事件,我将其称为 MyMouseUp。此自定义事件将先前创建的 MyMouseEventArgs 和新人

    作为参数
    Public Class Person
           Inherits UserControl
    
    Public Shared Event MyMouseUp(sender As Object, e As MyMouseUpEventArgs)
    
    Public Sub New()
        AddHandler Me.MouseUp, AddressOf OnMouseUp
    End Sub
    
    Private Overloads Sub OnMouseUp(sender As Object, e As MouseEventArgs)
        RaiseEvent MyMouseUp(sender, New MyMouseUpEventArgs(Me, e.Button, e.Clicks, e.X, e.Y, e.Delta))
    End Sub
    End Class
    

    必须共享自定义事件才能在处理程序中使用它 class 而无需步骤

  3. 中显示的对象引用
  4. 处理程序(这里只是主窗体)现在使用自定义事件参数注册到新的自定义事件。这样你就可以访问 newPerson.

    Public Class Form1
    
    Public Sub New()
        InitializeComponent()
    
        AddHandler Person.MyMouseUp, AddressOf OnyMyMouseUp
    End Sub
    
    Private Overloads Sub OnyMyMouseUp(sender As Object, e As MyMouseUpEventArgs)
        'Do stuff
        e.newPerson.BackColor = Color.Aqua
    End Sub
    End Class
    

希望对您有所帮助。代码未经测试,因此不提供任何保证;)