首页新闻找找看学习计划

C#中如何自动检查webbrowser文档加载完毕

0
[已解决问题] 解决于 2010-10-28 11:46

 C# winform 窗体上有三个控件 两个button(button1和button2)和一个webbrowser,我在button1中检测webbroser加载文档是否完毕,如果完毕则点击button2,否则等待 webbrowser1加载完毕,这个逻辑应该怎么表达呢

我目前是这样搞的

在button1_click函数中
webBrowser1.Navigate(s);
while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete)
{


};
btnNextPage_Click(
null, null);
结果发现的问题是,函数死循环在while语句

 

finallyly的主页 finallyly | 初学一级 | 园豆:100
提问于:2010-10-25 17:16
< >
分享
最佳答案
0

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            button2_Click(button2, null);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                button2_Click(button2, null);
            }
            else
            {
                webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
            }
        }

nabber | 菜鸟二级 |园豆:479 | 2010-10-25 17:25
button1事件中应该加入 webBrowser1.Navigate(s); 吧 webBrowser1_DocumentCompleted 属于异步调用的函数,应该不能直接操作控件,所以button2_Click(button2, null); 应该改成 button2_Click(null, null);或者用button2.BeginInvoke(...) 个人拙见,没经过程序验证,如果有错误的地方,敬请无视掉
avenger | 园豆:215 (菜鸟二级) | 2010-10-25 18:04
额,还真没考虑这方面,有时间要试一下这个例子。
nabber | 园豆:479 (菜鸟二级) | 2010-10-26 09:32
其他回答(4)
0

当然会是死循环,因为webbrowser加载有一个过程,你在button1的事件中去检查永远不会完成,因为这时候是还在服务器post当中。你要在客户端判断!就像判断ajax请求状态那样。

Repository | 园豆:610 (小虾三级) | 2010-10-25 17:21
我这就是个窗体程序,请问哪有客户端?
支持(0) 反对(0) finallyly | 园豆:100 (初学一级) | 2010-10-25 17:25
@finallyliuyu:楼下的正解,通过回调函数来解决!
支持(0) 反对(0) Repository | 园豆:610 (小虾三级) | 2010-10-25 18:27
@finallyliuyu:我只是打个比方!ajax也是通过回调来执行的!
支持(0) 反对(0) Repository | 园豆:610 (小虾三级) | 2010-10-25 18:28
0

webBrowser1.Navigate(s);
                    while(webBrowser1.ReadyState!=WebBrowserReadyState.Complete)
                    {

          Application.DoEvents();
                    };
                    btnNextPage_Click(
null, null);

在 while 语句中加上 Application.DoEvents(); 试试~

碧水寒潭 | 园豆:267 (菜鸟二级) | 2010-10-25 17:26
0
private void button1_Click(object sender, EventArgs e)
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
DoSomeThing();
}
}

private void button2_Click(object sender, EventArgs e)
{
DoSomeThing();
}

private void DoSomeThing()
{
//
}
Firen | 园豆:5483 (大侠五级) | 2010-10-25 17:30
-1

没办法解决的,使用过Iframe后

建议不要用webbrowser

使用httpRequest来实现也好

妹夫 | 园豆:215 (菜鸟二级) | 2010-10-25 17:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册