2011-11-15 32 views
8

WebBrowserドキュメントが編集モードに設定されています。 WebBrowser.Document.Body.InnerTextを使用してbody要素の内側のテキストを操作しようとしていますが、WebBrowser.Document.Bodyはnullのままです。ここで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がnullのまま、なぜ私は理解していません。フォームにテキストをロードする必要があるときはいつでもドキュメントの本文をリセットすることができますが、これが何であれ、知識のために何も変わっていない場合は、なぜこれが動作しているのかを理解することをお勧めします。

これに関するお手伝いをさせていただきます。

+0

あなたはplsはこのリンクを見てみましょう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

DomDocument.Bodyがnullにならないように、WebブラウザのDocumentCompletedイベントが発生するのを待たなければなりません。私は検証するためにこれをテストしました。私はまだ質問が残っていると思います:ドキュメントが完全に読み込まれていないときに、基礎となるCOMインターフェイスをどのように編集することができますか?

IHTMLDocument2ポインタがDocumentCompletedとコンストラクタで同じであるかどうかを調べました。基底のCOMオブジェクトが単一のHTMLドキュメントオブジェクトを再利用することを示す可能性があります。コンストラクタで行った変更は、少なくとも上書きされたり例外をスローされる可能性があります。例えば

私は、コンストラクタでこれを行う場合、私はエラーを取得する:

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

p1.title = "Hello world!"; 

私はDocumentCompletedハンドラ内で同じことを行う場合は、それが正常に動作します。

これが役に立ちます。ありがとう。 WebBrowserコントロールは、ドキュメントの読み込みを完了したときに

2

使用最初DocumentCompletedのイベントは、それが発生します。

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

かの簡単な方法:あなたが一人で少し仕事をするWebBrowser制御ができるようにする必要があります

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

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