VB.NET-如何将大量事件添加到单个句柄?

时间:2019-04-25 13:48:49

标签: vb.net winforms events

最近,我正在开发一个包含一些TextBoxes,CheckBoxes,ComboBoxes等的程序,我发现使一个函数处理多个事件非常简单,您只需用逗号和代码分隔事件识别单个事件。

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

但是您仍然会遇到讨厌的文本块。有没有更简洁的方法?我想到的是,将一系列对象事件作为参数确实很棒,但是我认为这是不可能的。

3 个答案:

答案 0 :(得分:4)

您可以使用

RETR

语法

编写一个Sub,它接受一个对象数组并在其上循环以为每个事件添加处理程序,就足够简单了。

对于复选框:

AddHandler ObjectName.EventName, AddressOf EventHandlerName

答案 1 :(得分:0)

您可以简单地迭代控件集合中的控件,而不必大惊小怪。如果要排除/添加任何给定的控件,也可以做进一步的条件,例如下面的示例中的TextBox Case的示例。

Private Sub DataTables_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    For Each Ctrl As Control In Panel1.Controls
        Select Case Ctrl.GetType
            Case GetType(CheckBox)
                AddHandler DirectCast(Ctrl, CheckBox).CheckedChanged, Sub(S As Object, EA As EventArgs)
                                                                          Dim ChkBox As CheckBox = DirectCast(S, CheckBox)
                                                                          'do something with ChkBox
                                                                      End Sub

            Case GetType(TextBox)

                Select Case Ctrl.Name
                    Case "TextBox1", "TextBox2" 'Add handle only to these contrls
                        'Or you could add Case Else and put the below handle within it
                        'Then this becomes an exclusion case
                        AddHandler DirectCast(Ctrl, TextBox).TextChanged, Sub(S As Object, EA As EventArgs)
                                                                              Dim TxtBox As TextBox = DirectCast(S, TextBox)
                                                                              'do something with TxtBox
                                                                          End Sub
                End Select

        End Select

    Next
End Sub

答案 2 :(得分:0)

其他信息:您可以通过选择控件来选择过程作为事件处理程序。然后在“属性”窗口中单击闪电以显示“事件”。选择要分配处理程序的事件,然后选择右侧的下拉箭头。结果列表将显示与该事件签名匹配的所有Sub。选择所需的控件,设计人员将把该控件编写或追加到Handles子句中。

使用与事件匹配的签名向表单添加过程。

Private Sub MultipleButtons(sender As Object, e As EventArgs)

End Sub

在下拉列表中,包含与事件签名匹配的所有Subs。

enter image description here

设计器编写Handles子句

Private Sub MultipleButtons(sender As Object, e As EventArgs) Handles Button5.Click

End Sub