2011-11-15 196 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");