【发布时间】:2019-09-14 23:30:04
【问题描述】:
最近我一直在开发一个包含几个文本框、复选框、组合框等的程序,我发现让一个函数处理多个事件非常简单,只需用逗号分隔事件和代码识别个别事件。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click, Button2.Click
MsgBox("Hello World!")
End Sub
但是,当您开始有大量事件要由同一个函数处理时,它会变得有点混乱。
Private Sub Checks_CheckedChanged(sender As Object, e As EventArgs) Handles chkInput1.CheckedChanged, chkInput2.CheckedChanged, chkInput3.CheckedChanged, chkInput4.CheckedChanged, checkInput5.CheckedChanged, chkOutput.CheckedChanged
MsgBox("Checks Changed!")
End Sub
您可以使用续行符_ 让它看起来更好一点。
Private Sub Checks_CheckedChanged(sender As Object, e As EventArgs) Handles _
chkInput1.CheckedChanged, chkInput2.CheckedChanged, chkInput3.CheckedChanged, _
chkInput4.CheckedChanged, checkInput5.CheckedChanged, chkOutput.CheckedChanged
MsgBox("Checks Changed!")
End Sub
但你仍然会得到一个令人讨厌的文本块。有没有更干净/简洁的方法来做到这一点?我的想法是,将一组对象事件作为参数是非常好的,但我认为这是不可能的。
【问题讨论】:
-
您始终可以在运行时连接事件:
AddHandler chkInput1.CheckedChanged, AddressOf Checks_CheckedChanged -
在表单的构造函数 (
Sub New()) 中添加处理程序。请注意,sender对象可以转换为CheckBox。这将为您提供引发事件的控件。如果处理程序中的代码简单/简短,您还可以使用 lambda (Sub()) 作为委托,而不是AddressOf。 -
@Jimi 我对您的解决方案很感兴趣,但很困惑。通过将处理程序添加到构造函数,它如何使其处理多个事件?您是否仍然不必设置函数以某种方式处理哪些事件?
-
在
Sub New(),InitializeComponent() 之后:For Each chkBox As CheckBox In Me.Controls.OfType(Of CheckBox).ToArray() AddHandler chkBox.CheckedChanged, Sub() chkBox.BackColor = If(chkBox.Checked, Color.Red, Color.Green) Next。现在,尝试检查/取消选中您的复选框(此处为表单的直接子级),看看会发生什么。 -
在实践中,您会得到相同的结果。但是您总是希望您的
Load()处理程序过程尽可能轻(未订阅?更好)。这个事件还有一个问题:它吞噬了异常。它还会减慢表单的呈现速度。