2

我的 Windows 窗体应用程序中有一个WebBrowser控件,但它只是不加载文档。

这是我的代码:

webBrowser1.Navigate(@"C:\Pages\myLocalWebPage.html");
File.WriteAllText(path,webBrowser1.Document.Body.Parent.OuterHtml, Encoding.GetEncoding(webBrowser1.Document.Encoding));

null reference exception它在第二行给了我一个。我想 Document 根本没有实例化。

4

2 回答 2

1

您尝试访问尚未加载的文档,因为您在导航到新 Uri 后立即访问该Document属性,这就是您获得NullReferenceException.

您需要使用该WebBrowser.DocumentCompleted事件。


该事件何时被触发?

从 MSDN 中,只要设置了以下属性之一或调用了方法之一,WebBrowser控件就会导航到新文档:Url、DocumentText、DocumentStream、Navigate、GoBack、GoForward、GoHome、GoSearch。

导航将按此顺序触发以下事件:

  • Navigating事件:

    处理导航事件以在导航开始之前接收通知。如果未满足某些条件(例如,当用户未完全填写表单时),处理此事件可让您取消导航。

  • Navigated事件:

    当 WebBrowser 控件完成导航并开始在新位置加载文档时,处理 Navigated 事件以接收通知。

  • DocumentCompleted事件:

    处理 DocumentCompleted 事件以在新文档完成加载时接收通知。当 DocumentCompleted 事件发生时,新文档已完全加载,这意味着您可以通过 Document、DocumentText 或 DocumentStream 属性访问其内容。


我的控件不可见。它不应该被用户使用。我只是想从代码隐藏中加载一个文档

控件不可见的事实应该不是问题。我已经webbrowser在运行时创建了一个我没有添加到表单中的测试(参见下面的示例),并且该事件仍然被引发。


它是如何被激活的?

这是一个可能的实现:

private WebBrowser wb;

private void Button1_Click(System.Object sender, System.EventArgs e)
{
    if (wb == null) {
        wb = new WebBrowser();
        wb.DocumentCompleted += wb_DocumentCompleted;
    }
    wb.Navigate("YourPath");
}

private void wb_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
    IO.File.WriteAllText(IO.Path.Combine(Application.StartupPath, "Test.html"), wb.Document.Body.Parent.OuterHtml, System.Text.Encoding.GetEncoding(wb.Document.Encoding));
}

另请参阅此线程我可以使用 for 循环等待网络浏览器完成导航吗?

于 2013-08-28T15:52:53.633 回答
0

您的本地文件路径需要与此类似(file:// 是关键):

Uri uri = new Uri("file://C:/Pages/myLocalWebPage.html");
webBrowser1.Navigate(uri);
于 2013-08-28T15:45:52.530 回答