如何让一个事件处理程序处理所有按钮的点击事件?

3
在我的程序中,我有9个按钮,并且为每个按钮分别编写了9个事件处理程序,尽管每个事件处理程序中的代码都是相同的。更改所有按钮的代码非常繁琐。是否可以创建一个单一的Button.Click事件处理程序来处理所有按钮的Button.Click事件?
3个回答

8

您可以修改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可能是或者一个面板、组合框等——按钮所在的位置。


2
您可以将点击事件连接到一个特定的按钮上。如何操作取决于您使用的IDE。 如果您使用的是Visual Studio,则: 选择一个按钮控件并按下F4键。这将为该控件打开属性窗口。在事件部分(通常是一个小闪电图标),您可以分配此特定控件支持的各种事件。在这里,您可以选择任何特定事件或创建自己的事件。

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 属性,仅在该值匹配时才连接处理程序。这只是我能想到的几种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接