在vb.net表单中,我有20个按钮。它们命名为BTNLOC1〜BTNLOC20。我不想对每个按钮单击事件进行编码。
-
如何循环遍历每个按钮以检查单击哪个按钮?
-
我是否需要实现计时器tick才能收听按钮点击事件?
您可以为所有Buttons
创建一个事件处理程序。选择设计器中的所有按钮,打开"属性"窗口,单击事件按钮,然后双击Click
事件。这将生成Click
事件处理程序,就像您双击设计器中的Button
一样,除了该 Handles
子句中的多个项目。然后,您可以使用sender
参数来加速单击的Button
,例如
Private Sub Buttons_Click(sender As Object, e As EventArgs) Handles Button1.Click,
Button2.Click,
Button3.Click
Dim btn = DirectCast(sender, Button)
'Use btn here.
End Sub
那么,您想对该Button
做什么?如果您想为每个Button
做不同的事情,那么您确实应该创建单独的事件处理程序。另外,您可能有数据列表,并且要使用该列表中的项目,该项目与单击的Button
相对应。有很多方法可以做到这一点。一种是将数据放在Button
本身的Tag
属性中,然后从那里检索。另一个是使用并发索引,例如
Dim buttons = Controls.OfType(Of Button)().ToArray()
Dim data = {"First", "Second", "Third"}
MessageBox.Show(data(buttons.IndexOf(btn)))
显然,您需要确保Button
数组和数据数组确实对齐。
如果单击按钮,请注意 - eventhandler是最佳选择。
但是您只能为所有按钮创建一个EventHandler
Private Sub Button_Click(sender As Object, e As EventArgs)
Dim button As Button = DirectCast(sender, Button)
MessageBox($"Button '{button.Name}' was clicked")
End Sub
然后在构造函数
中Public Sub New()
InitializeComponennts()
AddHandler Button1.Click, AddressOf Me.Button_Click
AddHandler Button2.Click, AddressOf Me.Button_Click
AddHandler Button3.Click, AddressOf Me.Button_Click
' and so on
End Sub
如果要获取有关单击每个按钮的信息
Private ButtonsClickAmount As New Dictionary(Of String, Integer)()
Private Sub Button_Click(sender As Object, e As EventArgs)
Dim button As Button = DirectCast(sender, Button)
If ButtonsClickAmount.ContainKey(button.Name) = True Then
ButtonsClickAmount(button.Name) += 1
Else
ButtonsClickAmount.Add(button.Name, 1)
End If
End Sub