我有一个在运行时创建并添加到表单的 WebBrowser 控件。
如何将此控件连接到可以在运行时处理其事件的子程序?
例如
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关键字;请参阅文档。
使用的替代方法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
,
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
我通过检查表单设计器生成的代码了解到这一点。从那里复制其中一个示例,如果您环顾四周,您可能会学到一些关于在运行时设置控件的其他有价值的东西。
在 C# 中,它使用 += 完成,在以函数作为参数的类的事件成员上,但我没有方便的 VB.net 来检查自己......对不起。
编辑:这是 Daniel L 在他的回答中很好地描述的AddHandler,并且在msdn中有详细的描述。
例子
AddHandler SharedTimer.Tick, AddressOf SharedTimer_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 语句来执行这些操作。您可以像这样在运行时将任何事件处理程序添加到网络浏览器
AddHandler WebBrowser1.xEvent, AddressOf WebBrowser1EventHandler
同样,您可以使用 RemoveHandler,它将事件与事件处理程序断开连接,如下所示:
RemoveHandler WebBrowser1.XEvent, AddressOf WebBrowser1EventHandler