【发布时间】:2014-06-03 18:50:44
【问题描述】:
在我的程序中,我有 9 个按钮,每个按钮都有 9 个单独的事件处理程序,尽管每个事件处理程序中的代码是相同的。事实证明,为所有这些更改代码是非常乏味的。是否可以创建一个 Button.Click 事件处理程序来处理我所有按钮的 Button.Click 事件?
【问题讨论】:
标签: .net vb.net events button event-handling
在我的程序中,我有 9 个按钮,每个按钮都有 9 个单独的事件处理程序,尽管每个事件处理程序中的代码是相同的。事实证明,为所有这些更改代码是非常乏味的。是否可以创建一个 Button.Click 事件处理程序来处理我所有按钮的 Button.Click 事件?
【问题讨论】:
标签: .net vb.net events button event-handling
您可以修改 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 或面板、组框等 - 无论按钮在哪里。
【讨论】:
您可以将您的点击事件连接到一个特定的事件。你怎么做取决于你使用的IDE。 如果您使用的是 Visual Studio,那么:
选择一个按钮控件并按 F4。这将打开该控件的属性窗口。在事件部分(通常是一个小闪电图标)中,您可以分配此特定控件支持的各种事件。在这里您可以选择任何特定的活动或创建自己的活动。
【讨论】:
以下是在运行时动态执行此操作的方法,因此您不必为所有按钮编写 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 属性设置为某个值,并且仅在该值匹配时才连接处理程序。只是我能想到的几种方法。
【讨论】: