2011-11-15 149 views
8

我有一个WebBrowser文档集处于编辑模式。我试图通过使用WebBrowser.Document.Body.InnerText来操纵正文元素的内部文本,但是,WebBrowser.Document.Body保留为空。WebBrowser.Document.Body始终为空

这里就是我创建文档内容的代码:

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保持为空。我知道,无论何时我需要将文本加载到表单中,我总是可以重置文档主体,但我更愿意理解为什么表现如此,如果没有其他知识。

对此非常感谢。

+0

你会请看看这个链接http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx?msg=2478179 –

+0

没有骰子,我在阅读那篇文章后发布在这里 –

+0

看看http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/displaying-custom-html-in-webbrowser-control.aspx –

回答

5

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

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

例如,如果我这样做在构造函数中,我得到一个错误:

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

p1.title = "Hello world!"; 

如果我做同样的DocumentCompleted处理程序,它工作正常。

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

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; 
      }; 
} 
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; 
} 
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");