AddressOf在Visual Basic .NET中

Alp*_*lph 1 .net vb.net addressof

我有通过代码生成的按钮(动态).我必须将一个事件(相同)与他们联系起来.我用AddHandler button.click, AddressOf mysub.

问题是mysub获取了一个string(mysub(string)),但是AddressOf不接受例程中的参数.我怎样才能做到这一点?使用AddressOf的替代方法.

Public Class Form1

   ...

   Private Sub mysub(ByVal sender As Object, ByVal e As System.EventArgs, ByVal str As String)
      ...
      ...
   End Sub

   ...

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      ...

      While something
         ...
         Dim btn As New Button
         ...
         AddHandler btn.click, AddressOf mysub 'here the issue
      End While

      ...

   End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 6

听起来你有以下场景

Class MyClass
  Public button As Button

  Public Sub New() 
    AddHandler button.Click AddressOf MySub
  End Sub

  Public Sub MySub(p As String)

  End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那么你有几个选择.最简单的方法是使用辅助方法.让它成为事件处理程序,然后调用该MySub函数

  Public Sub New() 
    AddHandler button.Click AddressOf MyHelper
  End Sub

  Public Sub MyHelper(sender As Object, e As EventArgs)
    MySub(TheStringValue)
  End Sub
Run Code Online (Sandbox Code Playgroud)

编辑

在与OP交谈之后,问题是将Form1_Load函数中的局部传递给MySub方法.如果您使用的是Visual Studio 2010,最简单的方法是使用Sublambda表达式

Dim theString = ...
AddHandler button.Click (Sub (sender, e) MySub(sender, e))
Run Code Online (Sandbox Code Playgroud)

如果您使用早期版本的Visual Studio,则需要手动构建闭包,这有点困难.

Class Closure 
  Public TheForm as Form1
  Public TheString As String
  Public Sub OnClick(sender As Object, e As EventArgs)
    TheForm.MySub(sender, e)
  End Sub
End Class

...

' In Form1_Load
Dim closure As New Closure
closure.TheForm = Me
closure.TehString = get the string 
Run Code Online (Sandbox Code Playgroud)

AddHandler按钮.单击AddressOf closure.OnClick