.net 将参数传递给AddressOf为的函数

.net 将参数传递给AddressOf为的函数,.net,vb.net,parameters,addressof,.net,Vb.net,Parameters,Addressof,我目前在VB.NET中支持一个应用程序,其中主窗体(Form1)在特定时间显示另一个窗体(Form2)。当显示Form2时,将添加一个处理程序来捕获Form2中发生的事件 下面是一个简单的例子: Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Form2.Show() AddHandler Form2.CalibrationCh

我目前在VB.NET中支持一个应用程序,其中主窗体(Form1)在特定时间显示另一个窗体(Form2)。当显示Form2时,将添加一个处理程序来捕获Form2中发生的事件

下面是一个简单的例子:

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub

Private Sub CalibrationCheckComplete()
    MessageBox.Show("Form2 Event raised.")
End Sub
End Class

Public Class Form2
Public Event CalibrationCheckComplete()
Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    RaiseEvent CalibrationCheckComplete()
End Sub
End Class
此示例只是将处理程序添加到Form2上的事件中,该事件在引发事件时显示MessageBox。实际应用程序在调用此回调函数时使用了许多在Form1中定义的变量等

现在,我想在另一个实例中显示Form2,并使用相同的回调函数,知道是哪个调用了它。但是我在尝试向回调(AddressOf)函数传递参数时遇到了问题

下面是我的尝试,其中有错误“'AddressOf'操作数必须是方法的名称(不带括号)。”


如何将一个参数(如整数)传递到AddressOf函数中,然后确定最初调用它的函数是哪个?

您必须创建不同的函数,每个函数处理数字

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete1
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete2
End Sub

Private Sub CalibrationCheckComplete1()
    CalibrationCheckComplete(1)
End Sub

Private Sub CalibrationCheckComplete2()
    CalibrationCheckComplete(2)
End Sub

Private Sub CalibrationCheckComplete(ByVal number As Integer)
    MessageBox.Show("Form2 Event raised. Called from number:" & number)
End Sub
但我怀疑你在做什么。如果Form2知道它是如何打开的可能会更好

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Number = 1
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Number = 2
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub

Private Sub CalibrationCheckComplete()
    MessageBox.Show("Form2 Event raised. Called from number:" & Form2.Number)
End Sub

我相信我已经通过使用lambda表达式找到了答案:AddHandler Form2.CalibrationCheckComplete,Sub()CalibrationCheckComplete(1)End Sub这是正确的方法吗?这就是为什么事件应该有
EventHandler
签名的原因。你的没有。
EventHandler
将触发事件的
sender
对象传递到方法中。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Number = 1
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Form2.Number = 2
    Form2.Show()
    AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete
End Sub

Private Sub CalibrationCheckComplete()
    MessageBox.Show("Form2 Event raised. Called from number:" & Form2.Number)
End Sub