VB.NET - Как добавить большое количество событий в один дескриптор? - PullRequest
3 голосов
/ 25 апреля 2019

Недавно я работал над программой, которая имеет несколько 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 ]

4 голосов
/ 25 апреля 2019

Вы можете сделать это, используя синтаксис

AddHandler ObjectName.EventName, AddressOf EventHandlerName

Достаточно просто написать подпрограмму, которая принимает массив объектов и циклически повторяет их, добавляя обработчик для каждого события.

Для флажков:

Public Sub AddHandlerSub(PassedArray As CheckBox())
    For Each item As CheckBox in PassedArray
        AddHandler Item.CheckedChanged, AddressOf EventHandlerName
    next
End Sub
0 голосов
/ 25 апреля 2019

Дополнительная информация: Вы можете выбрать процедуры в качестве обработчиков событий, выбрав элемент управления.Затем в окне «Свойства» щелкните значок молнии, чтобы отобразить «События».Выберите событие, которое вы хотите назначить обработчику, а затем стрелку выпадающего меню справа.Результирующий список будет отображать все подпрограммы, которые соответствуют подписи этого события.Выберите тот, который вам нужен, и дизайнер напишет или добавит элемент управления к предложению Handles.

Добавьте процедуру в форму с подписью, соответствующей событию.

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

End Sub

ВРаскрывающийся список содержит все подпрограммы, которые соответствуют подписи события.

enter image description here

Разработчик пишет предложение Handles

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

End Sub
0 голосов
/ 25 апреля 2019

Вы можете просто выполнять итерации элементов управления в коллекции элементов управления и вообще не использовать массив. Вы также можете выполнить дополнительные условия, если хотите исключить / добавить какой-либо заданный элемент управления, например, в примере Case TextBox в следующем примере.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...