C# DocumentCompleted事件多次被调用的解决方法
网络文档整理.
大部分来自这里:http://topic.csdn.net/u/20100308/15/2d0a1313-e308-49d4-b936-1bba86a44b1a.html
关于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;
3. 使用AxWebBrowser. WebBrowser是AxWebBrowser的部分封装.
儿子干不了, 当然只能找老子了.
private void browser_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
SHDocVw.IWebBrowser2 doc=e.pDisp as SHDocVw.IWebBrowser2;
if (doc!=(sender as AxSHDocVw.AxWebBrowser).GetOcx())
return;//still loading other frames
//code when the load is really finished!
}