我需要将函数的引用传递给VB.NET中的另一个函数。怎么办呢?
我的函数需要在内部使用AddHandler,我需要为它传递一个处理函数。我的代码显然不起作用,但它传达了我需要的想法。
Public Function CreateMenuItem(ByVal Name As String, ByRef Func As AddressOf ) As MenuItem
Dim item As New MenuItem
item.Name = Name
'item. other options
AddHandler item.Click, AddressOf Func
Return item
End Function
还有其他办法吗? AddHandler需要以某种方式设置为函数中传递的参数......
答案 0 :(得分:13)
函数委托正是您需要执行的操作。首先,您需要在类中的某个位置定义委托。当然,更改签名以适合您的活动。
Public Delegate Sub MyDelegate(sender As System.Object, e As System.EventArgs)
您的函数将以委托作为参数。
Public Function CreateMenuItem(ByVal Name As String, del As MyDelegate) As MenuItem
''''
AddHandler item.Click, del
''''
End Function
Public Sub MyEventHandler(sender As System.Object, e As System.EventArgs)
''''
End Sub
以下是你如何称呼这个功能:
CreateMenuItem(myString, AddressOf MyEventHandler)
答案 1 :(得分:9)
函数中的第二个参数应该是EventHandler
类型,然后你的函数看起来像:
Public Function CreateMenuItem(ByVal Name As String, ByRef Func As EventHandler) As MenuItem
Dim item As New MenuItem
item.Name = Name
'item. Other options
AddHandler item.Click, Func
Return item
End Function
现在您需要一种方法来处理这些点击:
Private Sub ItemClick(sender As Object, e As EventArgs)
'Do something with that click here
End Sub
现在您可以使用以下内容来使用这两种方法:
Dim handler = New EventHandler(AddressOf ItemClick)
Dim i = CreateMenuItem("My item", handler)
i.PerformClick()
答案 2 :(得分:1)
首先,事件处理程序必须具有Subs。其次,AddressOf
不能用作类型。
如果sub在同一个类中,只需使用子名称。如果它在另一个类/文件中,您可能必须使子公共和/或将其限定为另一个类的成员。 AddHandler子句的子节点基本上必须遵循以下模式:
Public/Private Sub MyHandler(sender As Object, e As EventArgs)
如果您需要基于菜单项名称的不同例程,您可以使用一个处理程序,并根据触发事件的项目名称调用相应的例程。