如何让单个事件处理程序处理所有Button.Click事件?

时间:2014-06-03 18:50:45

标签: .net vb.net events button event-handling

在我的程序中,我有9个按钮,尽管每个事件处理程序中的代码都是相同的,但每个按钮都有9个单独的事件处理程序。事实证明,更改所有这些代码非常繁琐。是否可以创建一个Button.Click事件处理程序来处理所有按钮的Button.Click事件?

3 个答案:

答案 0 :(得分:7)

您可以修改VS生成的事件代码上的Handles子句,以便它可以为多个控件处理相同的事件。在大多数情况下,有人可能希望将大多数(但不是全部)按钮点击汇集到一个过程。要更改Handles子句:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button1.Click, 
                 Button3.Click, Button4.Click ...
    ' just add the extra clicks for the additional ones

    ' you will need to examine "Sender" to determine which was clicked

    ' your code here
End Sub

这也可以动态完成,例如在Load事件中(或在任何地方)创建并添加到表单的控件:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddHandler Button1.Click, AddressOf AllButtonsClick
    AddHandler Button2.Click, AddressOf AllButtonsClick
    AddHandler Button3.Click, AddressOf AllButtonsClick

End Sub

要明确地将所有按钮连接到同一事件,您可以循环访问控件集合(使用Linq):

For Each b As Button In XXXXX.Controls.OfType(Of Button)
     AddHandler b.Click, AddressOf MyClickHandler
Next

XXXXX可能是Me或面板,分组框等 - 按钮所在的位置。

答案 1 :(得分:2)

您可以将点击事件连接到一个特定事件。你如何做到这取决于你正在使用的IDE。 如果您使用的是Visual Studio,那么:

选择按钮控件并按F4。这将打开此控件的属性窗口。在事件部分(通常是一个小闪电图标),您可以分配此特定控件支持的各种事件。在这里,您可以选择任何特定的或创建自己的活动。

答案 2 :(得分:1)

以下是如何在运行时动态执行此操作,因此您无需为所有按钮编写AddHandler

Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each ctrl In Me.Controls
        If (TypeOf ctrl Is Button) Then _
           AddHandler DirectCast(ctrl, Button).Click, AddressOf HandleButtonClick
    Next
End Sub

当然,如果这个行程太宽,你可以在面板中只放置你想要连接到这个事件的按钮,然后循环抛出YourPanel.Controls中的控件而不是形成。或者,您可以将每个按钮上的.Tag属性设置为某个值,并仅在该值匹配时连接处理程序。只是我能想到的几种方式。