【问题标题】:WebBrowser created dynamically doesn't work动态创建的 WebBrowser 不起作用
【发布时间】:2011-03-04 22:54:25
【问题描述】:

我想在我的代码中以编程方式创建 WebBrowser 控件,然后读取页面内容。
我想我在做和设计师一样的事情,但是动态创建的控件不起作用(DocumentText 返回空字符串)

我做错了什么?

编辑 2:@Axarydax 建议后的代码更改(工作)

主块代码:

WebBrowser browser = new WebBrowser { Name = "myBrowser"};
browser.DocumentCompleted += browser_DocumentCompleted;
browser.Navigate("www.google.com");
while (pageLoaded == false)
{
  Thread.Sleep(500);       // pageLoaded is local field
  Application.DoEvents();  // didn't wotk without this...
}
Console.WriteLine(browser.DocumentText);

事件处理程序代码:

void browser_DocumentCompleted (object sender, WebBrowserDocumentCompletedEventArgs e )
{ 
    pageLoaded = true; 
}

【问题讨论】:

  • 现在你忘了让浏览器知道 DocumentCompleted 事件 -> 添加 browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted) 到 Main 方法
  • 我知道了 - 只是忘了粘贴这行代码。但我终于通过添加 Application.DoEvents(); 解决了这个问题。 while 循环中的命令。谢谢你指导我!

标签: c# .net winforms webbrowser-control


【解决方案1】:

Navigate 方法是异步的,因此您应该等待 NavigationComplete 事件被触发。 但是,如果您想要页面的 HTML,请使用 System.Net.WebClient。

【讨论】:

  • 我已根据您的建议更改了代码 - 仍然无法正常工作 - 知道如何解决吗?
  • 衷心感谢,这篇文章对我帮助很大!!
【解决方案2】:

Navigate 方法异步工作,因此页面在后台加载,访问DocumentText 属性时没有文本。

尝试将处理程序添加到 DocumentCompleted 事件并将您的 Console.WriteLine(browser.DocumentText) 调用移动到那里。

【讨论】:

  • 我需要在我的主程序线程中“等待”来处理读取的内容。我已将 Edit#1 添加到我的示例中,尝试将其存档。知道如何管理吗?
  • 如果您只需要页面的 HTML 源代码,请遵循 Axarydax 的建议。
【解决方案3】:

您需要发送消息以触发事件。使用缺少消息调度的 while 循环(例如 Application.DoEvents)阻止消息泵将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2011-11-28
    • 2016-09-02
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多