将AddressOf传递给VB.NET中的函数以使用AddHandler

时间:2013-05-24 17:06:50

标签: .net vb.net addhandler addressof

我需要将函数的引用传递给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需要以某种方式设置为函数中传递的参数......

3 个答案:

答案 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)

如果您需要基于菜单项名称的不同例程,您可以使用一个处理程序,并根据触发事件的项目名称调用相应的例程。