VB.Net WebBrowser控件添加自定义事件调用主应用方法的问题
问题分析与解决方案
现有代码核心问题
- 脚本里的
dispatchEvent(Row)完全错误:既没创建主应用绑定的UpdateList事件,也没按规范触发事件传递参数。 - VBScript触发DOM事件的方式不符合标准,且事件名和主应用绑定的
UpdateList不匹配。
方案一:修复自定义事件触发逻辑
1. 修改页面VBScript脚本
需要正确创建UpdateList事件并传递行ID参数:
Function deleteRow(rowid) set row = document.getElementById(rowid) row.parentNode.removeChild(row) ' 创建自定义事件并附加行ID参数 set evt = document.createEvent("Event") evt.initEvent("UpdateList", true, false) evt.rowId = rowid document.dispatchEvent(evt) End Function
2. 调整主应用事件处理代码
添加引用Microsoft.mshtml程序集后,在事件处理中获取行ID并更新主列表:
Private Sub WB_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WB.DocumentCompleted WB.Document.AttachEventHandler("UpdateList", AddressOf UpdateListHandler) End Sub Private Sub UpdateListHandler(ByVal sender As Object, ByVal e As EventArgs) Dim domEvent As mshtml.IHTMLEventObj = DirectCast(e, mshtml.IHTMLEventObj) Dim rowId As String = domEvent.rowId ' 这里写主列表移除逻辑,示例: ' MainList.RemoveAll(Function(item) item.Manifest = rowId) MsgBox("已移除行:" & rowId) End Sub
方案二:用ObjectForScripting直接调用主应用方法(更简便可靠)
这种方式跳过自定义事件,让网页脚本直接调用主应用暴露的.NET对象方法,兼容性和可读性更好。
1. 定义可被脚本访问的交互类
' 必须标记ComVisible(True)才能被WebBrowser脚本识别 <ComVisible(True)> Public Class ScriptInterop Public Sub OnRowDeleted(rowId As String) ' 在这里执行主列表更新逻辑 ' 示例:MainList.RemoveAll(Function(item) item.Manifest = rowId) MsgBox("已移除行:" & rowId) End Sub End Class
2. 初始化WebBrowser时设置交互对象
在窗体构造函数或初始化方法中添加:
WB.ObjectForScripting = New ScriptInterop()
3. 修改页面脚本(推荐改用JavaScript)
替换原VBScript为JavaScript(兼容性更好):
<SCRIPT language="JavaScript"> function deleteRow(rowid) { const row = document.getElementById(rowid); row.parentNode.removeChild(row); // 直接调用主应用暴露的方法 window.external.OnRowDeleted(rowid); } </SCRIPT>
如果坚持用VBScript,修改为:
Function deleteRow(rowid) set row = document.getElementById(rowid) row.parentNode.removeChild(row) window.external.OnRowDeleted(rowid) End Function
4. 行HTML生成代码无需修改,保持原按钮点击事件即可
额外实用建议
- 优先用JavaScript替代VBScript:WebBrowser控件(基于IE内核)对JavaScript支持更完善,后续维护更方便。
- 强制WebBrowser使用高版本IE模式:通过注册表设置避免旧IE版本的兼容性问题。
- 主列表更新后,若需要同步网页表格状态,可重新生成表格HTML并刷新WebBrowser。
内容的提问来源于stack exchange,提问作者Fred Kerber
相关产品推荐
相关产品推荐

