循环按钮检查单击哪个

  • 本文关键字:单击 按钮 循环 vb.net
  • 更新时间 :
  • 英文 :


在vb.net表单中,我有20个按钮。它们命名为BTNLOC1〜BTNLOC20。我不想对每个按钮单击事件进行编码。

  1. 如何循环遍历每个按钮以检查单击哪个按钮?

  2. 我是否需要实现计时器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

最新更新