C# 处理动态(运行时)控件的事件-VB.NET

C# 处理动态(运行时)控件的事件-VB.NET,c#,vb.net,dynamic,runtime,controls,C#,Vb.net,Dynamic,Runtime,Controls,我有一个WebBrowser控件,它是在运行时创建并添加到表单中的 如何将此控件连接到可以在运行时处理其事件的子例程?使用 e、 g 当你想摆脱它时(当你用完它时,你应该摆脱它) 在你的情况下,你可能会 Dim web as New WebBrowser() AddHandler web.DocumentCompleted, AddressOf HandleDocumentCompleted 假设您创建了一个名为HandleDocumentCompleted的事件处理程序 根据您的需要,您也可

我有一个WebBrowser控件,它是在运行时创建并添加到表单中的

如何将此控件连接到可以在运行时处理其事件的子例程?

使用

e、 g

当你想摆脱它时(当你用完它时,你应该摆脱它)

在你的情况下,你可能会

Dim web as New WebBrowser()
AddHandler web.DocumentCompleted, AddressOf HandleDocumentCompleted
假设您创建了一个名为HandleDocumentCompleted的事件处理程序


根据您的需要,您也可以在声明webbrowser时使用关键字;请参阅。

我通过检查表单设计器生成的代码了解了这一点。从这里复制一个示例,如果您环顾四周,您可能会学到一些关于在运行时设置控件的其他有价值的东西

在C#中,它是用+=,在一个类的事件成员上用一个函数作为参数完成的,但是我手头没有VB.net来检查我自己。。。对不起

编辑:丹尼尔L在他的回答中也描述了这一点,详细内容见。

  • 您需要使用AddHandler和RemoveHandler
  • 如果通过AddHandler手动添加事件,请确保使用RemoveHandler将其删除(在适当的位置)
  • 键入“AddHandler NameOfControl.”将通过intellisense提供可用事件的列表
  • Intellisense、documentation(或“错误列表”)也将为您提供事件处理程序的“签名”

在VB中使用声明性事件语法是使用
AddHandler
的一种替代方法。要使用它,可以使用
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
这种方法主要有两个优点:

  • 无需
    移除处理程序
  • 无需手动连接所有事件处理程序:这是自动完成的
示例


AddHandler SharedTimer.Tick,AddressOf SharedTimer\u Tick

'我有一个方法,可以在某些情况下发现控件并添加处理程序。
'这是一个简化的示例。
'是否可以在运行时传入处理程序

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)

您可以使用Addhandler语句来执行这些操作。 您可以在运行时向webbrowser添加任何事件处理程序,如下所示

AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler AddHandler WebBrowser1.xEvent,WebBrowser1EventHandler的地址 同样,您可以使用RemoveHandler,它将事件与事件处理程序断开连接,如下所示:

RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler RemoveHandler WebBrowser1.XEvent,WebBrowser1EventHandler的地址
Example(myPlaceholder, addressof MyRuntimeHandler)
AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler