2016-11-23 43 views
0

在VB.net窗体中,我有20个按钮。它们是从btnLoc1〜btnLoc20命名的。我不想编码每个按钮点击事件。循环按钮来检查哪个被点击

  1. 如何遍历每个按钮来检查哪个被点击?

  2. 我是否需要实现计时器滴答声来听按钮点击事件?

+1

_我不想编码每个按钮单击event_ - 你需要。您可以为所有按钮创建一个按钮单击事件处理程序 – Fabio

+1

Private Sub Buttons_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles Button1.Click,Button2.Click,_ Button3.Click,Button4.Click,Button5.Click, Button6.Click,Button7.Click,Button8.Click'等等...... End Sub –

回答

1

如果按钮被点击时发现 - 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 
1

您可以为所有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阵列和数据阵列排队。

+0

如果每个按钮都有自己的逻辑 - 每个按钮的自己的处理程序都是更清晰且更容易维护的出价,那么“索引“,”映射“方法 – Fabio

+0

@Fabio,是的,我已经在我的回答中说过,如果您想为每个”按钮“做不同的事情,应该使用单独的事件处理程序。尽管我的第二个代码片段没有为每个“Button”演示不同的逻辑。它为每个'Button'演示不同的数据,所有的逻辑都是相同的。在这种情况下,使用并发数组是一种优越的方法,因为它遵循DRY原则。 – jmcilhinney