WebBrowser.Document.Body始终为null

时间:2011-11-15 18:13:57

标签: c# .net winforms webbrowser-control

我将WebBrowser文档设置为处于编辑模式。我试图使用WebBrowser.Document.Body.InnerText来操纵body元素的内部文本,但WebBrowser.Document.Body仍为null。

以下是我创建文档内容的代码:

private WebBrowser HtmlEditor = new WebBrowser();
public HtmlEditControl()
{
    InitializeComponent();
    HtmlEditor.DocumentText = "<html><body></body></html>";
    myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument;
    myDoc.designMode = "On";
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
    myContentsChanged = false;
}

我可以编辑代码和一切正常,但我不明白为什么HtmlEditor.Document.Body仍然为空。我知道每当我需要将文本加载到表单中时,我总是可以重置文档正文,但我更愿意理解为什么它的行为方式如此,如果没有其他知识的话。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

您必须等待Web浏览器的DocumentCompleted事件触发DomDocument.Body不为空。我刚测试了这个来验证。我想这个问题仍然存在:当文档没有完全加载时,你如何通过底层的COM接口进行编辑?

我检查了DocumentCompleted和构造函数中的IHTMLDocument2指针是否相同。它们可能表示底层COM对象重用单个HTML文档对象。看起来你在构造函数中做的任何更改至少有很大的机会被覆盖或抛出异常。

例如,如果我在构造函数中执行此操作,则会收到错误:

IHTMLDocument2 p1 = (IHTMLDocument2) HTMLEditor.Document.DomDocument;

p1.title = "Hello world!";

如果我在DocumentCompleted处理程序中执行相同的操作,它可以正常工作。

希望这会有所帮助。感谢。

答案 1 :(得分:2)

首先使用DocumentCompleted事件,它在WebBrowser控件完成加载文档时发生:

public HtmlEditControl()
{
    InitializeComponent();
    HtmlEditor.DocumentText = "<html><body></body></html>";
    HtmlEditor.DocumentCompleted += HtmlEditorDocumentCompleted;
}

void HtmlEditorDocumentCompleted(object sender, 
                                 WebBrowserDocumentCompletedEventArgs e)
{
    myDoc = (IHTMLDocument2)((WebBrowser)sender).Document.DomDocument;
    myDoc.designMode = "On";
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
    myContentsChanged = false;
}

或简单的方式:

public HtmlEditControl()
{
    InitializeComponent();
    HtmlEditor.DocumentText = "<html><body></body></html>";
    HtmlEditor.DocumentCompleted += (sender, e) =>
            {
                myDoc = (IHTMLDocument2) HtmlEditor.Document.DomDocument;
                myDoc.designMode = "On";
                HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
                myContentsChanged = false;
            };
}

答案 2 :(得分:0)

您需要让WebBrowser控件单独工作,以便给它一些时间来设置Document.Body属性。

我通过致电Application.DoEvents();来做到这一点。

例如在您的代码中:

private WebBrowser HtmlEditor = new WebBrowser();
public HtmlEditControl()
{
    InitializeComponent();
    HtmlEditor.DocumentText = "<html><body></body></html>";

    // Let's leave the WebBrowser control working alone.
    while (HtmlEditor.Document.Body == null)
    {
        Application.DoEvents();
    }

    myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument;
    myDoc.designMode = "On";
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
    myContentsChanged = false;
}

答案 3 :(得分:0)

if (HtmlEditor.Document.Body == null)
{
   HtmlEditor.Document.OpenNew(false).Write(@"<html><body><div id=""editable""></div></body></html>");
}
HtmlEditor.Document.Body.SetAttribute("contentEditable", "true");