如何使用/传递参数到事件处理程序?

时间:2014-04-17 17:17:41

标签: .net vb.net winforms events parameters

我已经找到了有关此主题的一些信息,但我仍然不完全理解它,如果有人会告诉我如何在我的例子中做到这一点,我会很高兴。

基本上,我在VB.Net Windows Forms Application

中有一个填充了对象的数组
Dim button(9) As cbuttons

public sub fill()
   button(1) = New cbuttons("buttonName1", 2, true)
   button(2) = New cbuttons("ButtonName2", 3, true)
   button(3) = New cbuttons("ButtonName3", 4, true)
   ...

此数组用作按钮的源,这些按钮是动态生成的

public sub writeButtons()
    For Each item As cbutton In button

        Dim cmbDynamic As New Button()
        cmbDynamic.Location = New System.Drawing.Point(item.getX(), item.getY())
        cmbDynamic.Name = item.getname()
        cmbDynamic.Text = item.getName() & vbCrLf & item.getTypeString()
        TabPage1.Controls.Add(cmbDynamic)
        AddHandler cmbDynamic.Click, AddressOf Me.clicked 'here is the problem

然后我有一个应该做这样的事情的潜艇

public sub clicked()
  MessageBox.Show("You clicked on button " & ButtonName)

但是,我不知道如何将按钮名称(也没有任何其他参数)传递给子 clicked(),因为我无法将任何参数添加到 AddHalnder 行和 callByName()也不起作用

我正在寻找Javascript中的解决方案:

  onlick="clicked(this.id)"

谢谢

1 个答案:

答案 0 :(得分:4)

该方法必须具有与Control.Click事件委托匹配的参数,在本例中为EventHandler。因此,clicked方法需要Object类型参数,后跟EventArgs类型参数。

第一个参数表示事件发生的对象。因此,在处理程序中将其强制转换后,您将能够获取其任何属性,包括Name

Public Sub clicked(sender As Object, e As EventArgs)
    MessageBox.Show("You clicked on button " & CType(sender, Control).Name)
End Sub

修改

在评论中,您询问如何将额外参数传递给事件处理方法。对此,简短的回答是否定的。

然而,有很多方法可以解决这个问题。您可以在类范围内存储值并在处理程序中访问它们。您还可以在每个Button的{​​{1}}属性中存储信息。由于处理程序始终具有表示引发事件的对象的Tag参数,因此您可以在其上下文中检索其任何属性。

例如,当您创建新的Object实例时,可以将其Button属性设置为创建它的Tag值:

cbutton

因此,稍后您只需执行以下操作即可恢复完整的Public Sub writeButtons() ' ... Dim cmbDynamic As New Button() ' ... cmbDynamic.Tag = item ' ... End Sub 值:

cbutton

您可以将Public Sub clicked(sender As Object, e As EventArgs) Dim btn As Button = sender Dim item As cbutton = btn.Tag MessageBox.Show("You clicked on button " & item.getname() & " which has cbutton.anyproperty equals to " & item.anyproperty) End Sub 属性视为自由式存储。但建议的话:不要滥用它。您使用它越多,您的代码就越难以弄明白。另外,如果您有多个使用它们的机制,最终可能会出现意外值。

附加说明:

根据.NET约定,类型和类型成员的首选外壳是每个单词以大写字母开头。例如,Tag确实应该是writeButtons。我还应该提到以WriteButtons开头的方法表明I / O操作正在发生。在您的情况下,Write听起来更合适。