C#中WebBrowser.DocumentCompleted事件多次调用问题解决方法

 更新时间:2015年01月23日 10:07:05   投稿:junjie  
这篇文章主要介绍了C#中WebBrowser.DocumentCompleted事件多次调用问题解决方法,本文讲解了3种情况和各自情况的解决方法,需要的朋友可以参考下

关于DocumentCompleted事件,MSDN给出的解释是在文档加载完毕后执行,但是在我的程序中DocumentCompleted却被多次调用,查了一下资料,大概出现了以下几种情况。

1、WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complete。而MSDN对这两种状态值的解释是:Complete该控件已完成新文档及其所有内容的加载;Interactive该控件已经加载足够的文档以允许有限的用户交互,比如单击已显示的超链接。由此可见,实际上DocumentCompleted事件会在Interactive状态和Complete状态各调用一次,那么我们可以根据我们的需要来判断到底需要那一次。解决办法实例代码如下:

复制代码 代码如下:

if(webBrowser1.ReadyState!=WebBrowerReadyState.Complete)
    return;

2、如果一个页面中含有多个框架页,那么在每个框架页加载完成时也可能触发一次DocumentCompleted事件(MSDN对其解释是在多个的帧的情况下DocumentComplete获取触发多次。并非每个框架将触发此事件,但触发DownloadBegin事件的每个框架将触发相应的DocumentComplete事件)。这种情况下解决办法实例代码如下:
复制代码 代码如下:

if(e.Url.ToString()!=webBrowser1.Url.ToString())
    return;

此外,MSDN给出了另外一种方案,详见:

3、对于以上两种情况我是没遇到,却碰到了第三种情况:在我的DocumentCompleted事件里执行了相应的代码,结果又触发了一次DocumentCompleted事件,如此循环往复,没完没了。使用webBrowser1.Stop(),还是没法停止。webBrowser1.Nagviate("about:blank")问题还是依旧。这时候我们只能卸载DocumentCompleted事件了,即在DocumentCompleted事件里执行完你需要的代码后,再来一句:

复制代码 代码如下:

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

相关文章

  • VsCode使用EmmyLua插件调试Unity工程Lua代码的详细步骤

    VsCode使用EmmyLua插件调试Unity工程Lua代码的详细步骤

    这篇文章主要介绍了VsCode使用EmmyLua插件调试Unity工程Lua代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#中的DateTime是值类型还是引用类型

    C#中的DateTime是值类型还是引用类型

    近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容,大家有需要的朋友可以参考下
    2017-04-04
  • C#中string.Empty和null的区别详解

    C#中string.Empty和null的区别详解

    这篇文章主要介绍了C#中string.Empty和null的区别详解,本文同时讲解了空字符串和Empty的区别以及string.Empty与null的区别,需要的朋友可以参考下
    2015-06-06
  • C#中foreach实现原理详解

    C#中foreach实现原理详解

    这篇文章主要为大家详细介绍了C#中foreach实现原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • C#中Linq查询基本操作使用实例

    C#中Linq查询基本操作使用实例

    这篇文章主要介绍了C#中Linq查询基本操作使用实例,有需要的朋友可以参考一下
    2013-12-12
  • 谈谈C# replace在正则表达式中的意义

    谈谈C# replace在正则表达式中的意义

    这篇文章主要介绍了C# replace在正则表达式中的意义的相关资料,需要的朋友可以参考下
    2016-03-03
  • C#设置右键菜单的方法

    C#设置右键菜单的方法

    这篇文章主要介绍了C#设置右键菜单的方法,实例分析了C#设置右键菜单的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 详解StackExchange.Redis通用封装类分享

    详解StackExchange.Redis通用封装类分享

    这篇文章主要介绍了详解StackExchange.Redis通用封装类分享 ,详细的介绍了StackExchange.Redis通用封装,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • C#文件加密方法汇总

    C#文件加密方法汇总

    这篇文章主要介绍了C#文件加密方法,实例汇总了常见的加密方法如AES加密类、文件加密类、文件夹加密类等,最后给出完整的实例源码下载供大家参考借鉴,需要的朋友可以参考下
    2014-11-11
  • 简单聊聊C#的线程本地存储TLS到底是什么

    简单聊聊C#的线程本地存储TLS到底是什么

    C#的ThreadStatic是假的,因为C#完全是由CLR(C++)承载的,言外之意C#的线程本地存储,用的就是用C++运行时提供的 __declspec(thread)或__thread来虚构的一套玩法,下面我们就来深入讲讲C#的线程本地存储TLS到底是什么吧
    2024-01-01

最新评论