You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:25:22