VB.NET中的AddHandlers

Wil*_*ill 4 vb.net

我正在尝试动态创建dropdownList框,我想尝试添加AddHandlers它们,以便在它们中选择一个项时,它会触发一个事件,但也需要传递另一个变量,我不知道要放什么的参数system.EventArgs.请查看下面的代码,看看我遇到的问题.

AddHandler inputDrop.SelectedIndexChanged, AddressOf selOption(inputDrop, ???, var1)

Protected Sub selOption(ByVal sender As Object, ByVal e As System.EventArgs, ByVal tableCount As String)

End Sub
Run Code Online (Sandbox Code Playgroud)

我在这里放什么(???)

错误:

是一个事件,不能直接调用.使用'RaiseEvent'语句来引发事件.

slo*_*oth 6

此外,Mike C已经解释过,如果事件处理程序的签名与事件不匹配,您始终可以将事件处理程序包装在另一个方法中,例如匿名方法:

Protected Sub selOption(ender As Object, e As System.EventArgs, somestring As String)

End Sub

...

For i = 1 To 10
    Dim cbox = new ComboBox()
    Dim number = i ' local copy to prevent capturing of i '
    AddHandler cbox.SelectedIndexChanged, Sub(s, e) selOption(s, e, "Hi! I am Number " & number)
Next
Run Code Online (Sandbox Code Playgroud)

现在,当最后一个的索引ComboBox发生变化时,somestring传递给的参数selOption将是Hi! I am Number 10,而它将是Hi! I am Number 1第一个ComboBox等.


mcl*_*129 5

注册事件处理程序时,不会在那时指定参数.您基本上只是设置一个委托的引用,该委托将在引发事件时处理该事件.

AddHandler inputDrop.SelectedIndexChanged, AddressOf selOption
Run Code Online (Sandbox Code Playgroud)

最重要的是事件处理程序的方法签名与事件定义的方法签名完全匹配.我不确定您的方法是否有效,因为您tableCount指定了额外的参数.您需要将方法签名修改为:

Protected Sub selOption(ByVal sender As Object, ByVal e As System.EventArgs)
Run Code Online (Sandbox Code Playgroud)

我基于SelectedIndexChangedWinforms 的定义.可以在另一种技术(例如ASP.net或WPF)中以不同方式定义此事件.或者如果这是一个自定义类,它可能是一个完全不同的签名.但是,通常大多数事件处理程序都具有类似的结构sender(引发事件的实例)和一些事件参数.

然后当inputDrop触发它的事件时(当所选项目发生变化时),您的代码将自动被调用.传递给此方法的参数将直接传递inputDrop,您不必指定它们.

此外,您的AddHandler语句必须存在于方法或代码块中,它不能只存在于类定义中.这是一个必须像任何其他代码一样执行的声明,它不是声明.