Обработка событий для динамических (во время выполнения) элементов управления - VB.NET - PullRequest
1 голос
/ 12 февраля 2009

У меня есть элемент управления WebBrowser, который создается и добавляется в форму во время выполнения.

Как мне подключить этот элемент управления к подпрограмме, которая может обрабатывать его события во время выполнения?

Ответы [ 7 ]

8 голосов
/ 12 февраля 2009

Использование AddHandler

, например

AddHandler Obj.Ev_Event, AddressOf EventHandler

и когда вы хотите избавиться от него (и вы должны избавиться от него, когда вы закончите его использовать)

RemoveHandler Obj.Ev_Event, AddressOf EventHandler

в вашем случае у вас может быть что-то вроде

Dim web as New WebBrowser()
AddHandler web.DocumentCompleted, AddressOf HandleDocumentCompleted

при условии, что вы создали обработчик событий с именем HandleDocumentCompleted

В зависимости от ваших потребностей, вы также можете использовать ключевое слово WithEvents при объявлении своего веб-браузера; см. документацию .

2 голосов
/ 12 февраля 2009

Альтернативой использованию AddHandler является синтаксис декларативных событий в VB. Чтобы использовать его, вы объявляете элемент управления (как закрытый член), используя ключевое слово WithEvents. Затем ключевое слово Handles можно использовать в методах для обработки соответствующих событий:

Private WithEvents m_WebBrowser As WebBrowser

Private Sub WebBrowser_Navigate(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs) Handles m_WebBrowser.Navigate
    MsgBox("Hi there")
End Sub

Private Sub SomeActionThatCreatesTheControl()
    m_WebBrowser = New WebBrowser()
End Sub

У этого метода есть два основных преимущества:

  • Не нужно RemoveHandler,
  • Нет необходимости связывать все обработчики событий вручную: это делается автоматически.
1 голос
/ 12 февраля 2009
  • Вам нужно будет использовать AddHandler и RemoveHandler.
  • Если вы вручную добавляете событие через AddHandler, обязательно удалите его (в соответствующем месте) с помощью RemoveHandler.
  • Введите «AddHandler NameOfControl.» выдаст список доступных событий через intellisense.
  • Intellisense, документация (или «список ошибок») также предоставит вам «подпись» обработчика событий.

Private Sub WebBrowser1_Navigate(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs)

End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    RemoveHandler WebBrowser1.Navigated, AddressOf WebBrowser1_Navigate
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddHandler WebBrowser1.Navigated, AddressOf WebBrowser1_Navigate        
End Sub
0 голосов
/ 19 ноября 2011

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

AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler

и аналогичным образом вы можете использовать RemoveHandler, который отключает событие от обработчика событий следующим образом:

RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler
0 голосов
/ 18 июня 2010

'У меня есть метод, который обнаруживает элементы управления и добавляет обработчики в определенных ситуациях.
«Вот упрощенный пример.
«Можно ли передать обработчик во время выполнения?

Private Sub Example(byval ph as Placeholder)
  for each ctrl as control in ph.controls
    if typeof (ctrl) is textbox then
      dim cb as checkbox = ctrl
      AddHandler cb.DataBinding, AddressOf MyHandler
    end if
  next
end sub

«Я собираюсь сделать что-то более подобное ...

Private Sub Example(byval ph as Placeholder, **byref method as delagate**)
  for each ctrl as control in ph.controls
    if typeof (ctrl) is textbox then
      dim cb as checkbox = ctrl
      AddHandler cb.DataBinding, **method**
    end if
  next
end sub

Проблема в том, что я вызываю метод. Это не работает:

Example(myPlaceholder, addressof MyRuntimeHandler)
0 голосов
/ 12 мая 2010

Пример

AddHandler SharedTimer.Tick, AddressOf SharedTimer_Tick

0 голосов
/ 12 февраля 2009

Я узнал об этом, изучив код, сгенерированный конструктором форм. Скопируйте один из примеров оттуда, и если вы посмотрите вокруг, вы можете узнать некоторые другие ценные вещи о настройке элементов управления во время выполнения.

В C # это делается с помощью + =, для члена события класса с функцией в качестве параметра, но у меня нет VB.net, пригодного для проверки себя ... извините.

РЕДАКТИРОВАТЬ: Это AddHandler , как хорошо описано Дэниелом Л. в своем ответе, и в деталях на msdn .

...