我已经找到了有关此主题的一些信息,但我仍然不完全理解它,如果有人会告诉我如何在我的例子中做到这一点,我会很高兴。
基本上,我在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)"
谢谢
答案 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
听起来更合适。