4

我正在尝试动态创建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

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

错误

是一个事件,不能直接调用。使用“RaiseEvent”语句来引发事件。

4

3 回答 3

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

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

于 2013-09-10T14:31:13.270 回答
5

当您注册一个事件处理程序时,您当时没有指定参数。您基本上只是设置对委托的引用,该委托将在引发事件时处理该事件。

AddHandler inputDrop.SelectedIndexChanged, AddressOf selOption

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

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

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

然后,当inputDrop启动事件(选定的项目更改时)时,您的代码将自动调用。传递给此方法的参数将直接从 传递inputDrop,您不必指定它们。

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

于 2013-09-10T13:41:49.320 回答
4

还有另一种方法。继承有问题的控件并添加如下属性:

Public Class MyComboBox : Inherits ComboBox
  Public Property tableCount As String
End Class

然后设置您的自定义值并像常规 ComboBox 一样添加一个处理程序:

combo.tableCount = tableCount
AddHandler combo.Click, AddressOf combo_Click

在里面combo_Click, CTypesender到你继承的类型,并获取你之前存储的值:

Private Sub combo_Click(sender As Object, e As System.EventArgs)
  Debug.WriteLine(CType(sender, WorkflowActionBox).tableCount)
End Sub

您需要将当前使用的 替换ComboBoxMyComboBox,您希望新属性可用。就像打开您的设计器文件并进行查找/替换一样简单。

于 2013-09-10T14:42:37.943 回答