webBrowser如何循环绑定打开网页?

禁用F3 2013-06-16 08:28:28

private void btnRefresh_Click(object sender, EventArgs e)
{

dt = DBClass.GetDataTable("select * from ClientInfo");
while (true)
{
webBrowser1.Url = new Uri(uri);
webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click");
webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click");
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}
}


我这样写DocumentCompleted 事件里面没有处理就在不断的循环.要怎么做,进了DocumentCompleted 事件完成后再循环呢?
...全文
184 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
禁用F3 2013-06-17
  • 打赏
  • 举报
回复
晕.搞了这么久还是没有解决....
csdnfan 2013-06-17
  • 打赏
  • 举报
回复
看到使用yield 眼前一亮。。。还没有细研究过这个词的用法。项目中多次看到, 不过楼主把逻辑都描述出来了,按自己的逻辑写出来就可以了。真心想不明白哪里有问题? 大不了在while里加一个变量来判断你的DocumentCompleted 执行过了没有。执行过了,好的再往下执行。没有执行过就先跳过过会儿再接着处理。
禁用F3 2013-06-16
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
[quote=引用 7 楼 chirea 的回复:] [quote=引用 6 楼 caozhy 的回复:] webBrowser1.Url = new Uri(uri); => webBrowser1.Navigate(uri);
IEnumerable<object> foo() { webBrowser1.Navigate(uri);//这样的话,第一次没问题,第二次的话提示"Message = "无法访问已释放的对象。\r\n对象名:“WebBrowser”。"" webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click"); webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click"); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); yield return new object(); }[/quote] 你在哪里释放了WebBrowser,检查下。[/quote] 我根本就没有释放webBrowser1_DocumentCompleted这个事件处理完后我给他释放了,可是不释放他就在和5楼我说的哪个一样.不知咋整了.释放不是,不释放也不是...
threenewbee 2013-06-16
  • 打赏
  • 举报
回复
引用 7 楼 chirea 的回复:
[quote=引用 6 楼 caozhy 的回复:] webBrowser1.Url = new Uri(uri); => webBrowser1.Navigate(uri);
IEnumerable<object> foo() { webBrowser1.Navigate(uri);//这样的话,第一次没问题,第二次的话提示"Message = "无法访问已释放的对象。\r\n对象名:“WebBrowser”。"" webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click"); webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click"); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); yield return new object(); }[/quote] 你在哪里释放了WebBrowser,检查下。
禁用F3 2013-06-16
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
webBrowser1.Url = new Uri(uri); => webBrowser1.Navigate(uri);
IEnumerable<object> foo() { webBrowser1.Navigate(uri);//这样的话,第一次没问题,第二次的话提示"Message = "无法访问已释放的对象。\r\n对象名:“WebBrowser”。"" webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click"); webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click"); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); yield return new object(); }
threenewbee 2013-06-16
  • 打赏
  • 举报
回复
webBrowser1.Url = new Uri(uri); => webBrowser1.Navigate(uri);
禁用F3 2013-06-16
  • 打赏
  • 举报
回复

  IEnumerable<object> foo()
        {
            webBrowser1.Url = new Uri(uri);
//第二次的时候到这里的url还是上次的,new uri(uri)的值好像怎么也付不到给他.所以感觉总//是不能重新绑定一样.打断点看webBrowser1.Url是上次的地址
            webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click");
            webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click");
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
            yield return new object();
        }
禁用F3 2013-06-16
  • 打赏
  • 举报
回复
谢谢,各位.用版主的办法一样不成功.重新绑定后没有清空以前的.所以webBrowser1的Uri还是上一次的,没有重新绑定到地址.
threenewbee 2013-06-16
  • 打赏
  • 举报
回复
在按钮里面 dt = DBClass.GetDataTable("select * from ClientInfo"); loopenum = foo(); loopenum.GetEnumerator().Reset(); => 在按钮里面 dt = DBClass.GetDataTable("select * from ClientInfo"); loopenum = foo(); loopenum.GetEnumerator().MoveNext(); 我写了一个模拟程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class MyWebBrowser
    {
        public void Navigate() 
        {
            Thread.Sleep(1000);
            if (Completed != null) Completed(this, new EventArgs()); 
        }

        public event EventHandler Completed;
    }

    class Program
    {
        static IEnumerable<object> loopenum;

        static IEnumerable<object> foo()
        {
            MyWebBrowser wb = new MyWebBrowser();
            wb.Completed += new EventHandler(wb_Completed);
            wb.Navigate();
            yield return new object();
        }

        static void wb_Completed(object sender, EventArgs e)
        {
            Console.WriteLine("ok");
            loopenum.GetEnumerator().MoveNext();
        }

        static void Main(string[] args)
        {
            loopenum = foo();
            loopenum.GetEnumerator().MoveNext();
        }
    }
}
threenewbee 2013-06-16
  • 打赏
  • 举报
回复
可以借助yield关键字(C# 5.0可以使用await/async) IEnumerable<object> foo() { webBrowser1.Url = new Uri(uri); webBrowser1.Document.GetElementById("serviceType_Mac").InvokeMember("click"); webBrowser1.Document.GetElementById("fwdButtonC").InvokeMember("click"); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);      yield return new object(); } 在webBrowser1_DocumentCompleted里面 loopenum.GetEnumerator().MoveNext(); 在按钮里面 dt = DBClass.GetDataTable("select * from ClientInfo"); loopenum = foo(); loopenum.GetEnumerator().Reset(); 定义一个成员变量 IEnumerable<object> loopenum;
  • 打赏
  • 举报
回复
我上传过一个源代码,其中使用它下载数十万个网页,你可以参考其逻辑。 http://z.download.csdn.net/detail/sp1234/5494621

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧