Создайте проект без кнопок. Введите такой код:
Dim b As New Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(b) 'Добавляем новую кнопку в коллекцию
AddHandler
b.Click, AddressOf Обработчик_нажатия_на_кнопку
End Sub
Private Sub Обработчик_нажатия_на_кнопку(ByVal На_кого_нажали As Object, ByVal e As EventArgs)
На_кого_нажали.Text = "Нажали"
На_кого_нажали.Left = На_кого_нажали.Left + 30
End Sub
Поведение кнопки после запуска точно такое же, как и при 1 способе.
Пояснения: Вместо слова WithEvents и фрагмента Handles b.Click мы пишем один оператор:
AddHandler b.Click, AddressOf Обработчик_нажатия_на_кнопку
Слово AddHandler можно перевести как «Добавить обработчик». Слово AddressOf указывает на процедуру-обработчик события, иначе обработчик невозможно было бы найти, ведь в заголовке самого обработчика ничего теперь не указывает на то, какое событие он должен обрабатывать. В целом оператор можно перевести так: «Добавить обработчик события b.Click, находящийся в процедуре Обработчик_нажатия_на_кнопку».
В общем, оператор AddHandler связывает событие с обработчиком. Обратите внимание, что выполняется оператор в процессе выполнения кода проекта и пока он не выполнился, обработка невозможна, то есть нажатие на кнопку ни к чему не будет приводить. Более того, связь эту можно в любое время убрать аналогичным оператором RemoveHandler, после чего кнопка прекратит реагировать на нажатия.
К сожалению, никто нам здесь не предлагал автоматически создать заготовку обработчика.
Несколько обработчиков у одного события. Почему «Добавить» обработчик, а не «Создать»? Потому что обработчиков у одного события может быть много. Если вы хотите, чтобы при наступлении события выполнялась еще одна процедура-обработчик, просто напишите для нее еще один оператор AddHandler:
AddHandler b.Click, AddressOf Еще_один_обработчик_нажатия_на_кнопку