【问题标题】:Pass parameter to function with AddressOf使用 AddressOf 将参数传递给函数
【发布时间】: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


【解决方案1】:

你必须创建不同的函数来处理数字

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

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2013-01-27
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多