Die*_*wer 9 .net vb.net addressof addhandler
我需要将函数的引用传递给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
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?AddHandler需要以某种方式设置为函数中传递的参数...
小智 13
函数委托正是您需要执行此操作的.首先,您需要在类中的某个位置定义委托.当然,更改签名以适合您的活动.
Public Delegate Sub MyDelegate(sender As System.Object, e As System.EventArgs)
Run Code Online (Sandbox Code Playgroud)
您的函数将以委托作为参数.
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
Run Code Online (Sandbox Code Playgroud)
以下是您调用该函数的方式:
CreateMenuItem(myString, AddressOf MyEventHandler)
Run Code Online (Sandbox Code Playgroud)
函数中的第二个参数应该是类型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
Run Code Online (Sandbox Code Playgroud)
现在您需要一种方法来处理这些点击:
Private Sub ItemClick(sender As Object, e As EventArgs)
'Do something with that click here
End Sub
Run Code Online (Sandbox Code Playgroud)
你可以使用以下方法来使用这两种方法:
Dim handler = New EventHandler(AddressOf ItemClick)
Dim i = CreateMenuItem("My item", handler)
i.PerformClick()
Run Code Online (Sandbox Code Playgroud)
首先,事件处理程序必须有 Subs。其次,AddressOf不能用作类型。如果子级在同一个类中,则只需使用子级名称。如果它在另一个类/文件中,您可能必须将其公开和/或将其限定为另一个类的成员。AddHandler 子句的子句必须基本上遵循以下模式:
Public/Private Sub MyHandler(sender As Object, e As EventArgs)
Run Code Online (Sandbox Code Playgroud)
如果您需要根据菜单项名称使用不同的例程,则可以使用一个处理程序并根据触发事件的项目名称调用适当的例程。