在我的程序中,我有9个按钮,尽管每个事件处理程序中的代码都是相同的,但每个按钮都有9个单独的事件处理程序。事实证明,更改所有这些代码非常繁琐。是否可以创建一个Button.Click事件处理程序来处理所有按钮的Button.Click事件?
答案 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
属性设置为某个值,并仅在该值匹配时连接处理程序。只是我能想到的几种方式。