【发布时间】:2015-04-26 21:57:34
【问题描述】:
我目前支持 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' 操作数必须是方法的名称(不带括号)。”
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Form2.Show()
AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete(1)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Form2.Show()
AddHandler Form2.CalibrationCheckComplete, AddressOf CalibrationCheckComplete(2)
End Sub
Private Sub CalibrationCheckComplete(ByVal number As Integer)
MessageBox.Show("Form2 Event raised. Called from number:" & number)
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
如何将参数(例如整数)传递给 AddressOf 函数,然后确定最初调用它的函数?
【问题讨论】:
-
我相信我已经通过使用 lambda 表达式弄清楚了: AddHandler Form2.CalibrationCheckComplete, Sub() CalibrationCheckComplete(1) End Sub 这是正确的做法吗?
-
这就是为什么事件应该有一个
EventHandler签名。你的没有。EventHandler将触发事件的sender对象传递到方法中。
标签: .net vb.net parameters addressof