2014-04-17 98 views
1

我已经找到了关于这个主题的一些信息,但是我仍然不完全理解它,如果有人会告诉我如何在我的例子中做到这一点,我会很高兴。如何使用/传递参数给事件处理程序?

基本上,我有填充有在VB.Net视窗对象的数组窗体应用程序

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) 

但是,我不知道如何将按钮的名称(或任何其他参数)传递给子点击(),因为我不能将任何参数添加到AddHalnder线和callByName()也不起作用

我正在寻找一个解决方案可能看起来像这样在Javascript中指出:

onlick="clicked(this.id)" 

谢谢

回答

3

的方法必须有相匹配的Control.Click事件委托,在这种情况下是参数。因此,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 

编辑:

在你问如何额外的参数传递到事件处理的意见方法。对此,简短的回答是否定的。

但是,有办法解决这个问题。您可以将值存储在类范围内并在处理程序中访问它们。您也可以在每个ButtonTag属性中存储信息。由于处理程序始终有一个代表提升事件的对象的参数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 

你可以把Tag财产自由泳存储。建议的话虽然:不要滥用它。你使用它越多,你的代码就越难弄清楚。另外,如果你有多个使用它们的技工,你最终可能会在这些方面产生意想不到的价值。

附加说明:

作为每.NET惯例,对于类型和类型成员的优选壳是每个字以大写字母开头。例如,writeButtons确实应该是WriteButtons。我还应该提到,从Write开始的方法建议发生I/O操作。在你的情况下,CreateButtons听起来更合适。

+0

你真的帮了我很多,谢谢。即使认为我现在不需要它,但我很好奇是否可以传递超过1个参数。 – Labe

+1

@Labe我编辑了我的答案,看看它是否有帮助。 – Crono

相关问题