2

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

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

4

7 回答 7

9

使用AddHandler

例如

AddHandler Obj.Ev_Event, AddressOf EventHandler

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

RemoveHandler Obj.Ev_Event, AddressOf EventHandler

在你的情况下,你可能有类似的东西

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

假设您创建了一个名为 HandleDocumentCompleted 的事件处理程序

根据您的需要,您还可以在声明 Web 浏览器时使用WithEvents关键字;请参阅文档

于 2009-02-12T18:49:34.800 回答
2

使用的替代方法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
  • 无需手动连接所有事件处理程序:这是自动完成的。
于 2009-02-12T19:08:49.450 回答
1
  • 您将需要使用 AddHandler 和 RemoveHandler。
  • 如果您通过 AddHandler 手动添加事件,请务必使用 RemoveHandler 将其删除(在适当的位置)。
  • 键入“AddHandler NameOfControl”。将通过智能感知提供可用事件的列表。
  • 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
于 2009-02-12T18:59:08.630 回答
0

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

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

编辑:这是 Daniel L 在他的回答中很好地描述的AddHandler,并且在msdn中有详细的描述。

于 2009-02-12T18:53:14.497 回答
0

例子

AddHandler SharedTimer.Tick, AddressOf SharedTimer_Tick

于 2010-05-12T14:29:13.450 回答
0

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

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)
于 2010-06-18T11:43:31.960 回答
0

您可以使用 Addhandler 语句来执行这些操作。您可以像这样在运行时将任何事件处理程序添加到网络浏览器

AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler

同样,您可以使用 RemoveHandler,它将事件与事件处理程序断开连接,如下所示:

RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler
于 2011-11-19T11:19:54.083 回答