2011-11-15 6 views
8

WebBrowser 문서가 편집 모드로 설정되어 있습니다. WebBrowser.Document.Body.InnerText을 사용하여 본문 요소의 내부 텍스트를 조작하려고 시도하지만 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이 아니게하려면 웹 브라우저의 DocumentCompleted 이벤트가 시작될 때까지 기다려야합니다. 방금 검증을 위해 테스트했습니다. 나는 여전히 질문이 남아 있다고 가정합니다 : 문서가 완전히로드되지 않았 으면 기본 COM 인터페이스를 통해 어떻게 편집 할 수 있습니까?

IHTMLDocument2 포인터가 DocumentCompleted와 생성자에서 동일한 지 확인했습니다. 기본 COM 개체가 단일 HTML 문서 개체를 다시 사용함을 나타낼 수 있습니다. 생성자에서 변경 한 내용이 적어도 덮어 쓰거나 예외를 throw 할 수있는 가능성이있는 것 같습니다. 나는 DocumentCompleted 처리기에서 동일한 작업을 수행하는 경우

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

p1.title = "Hello world!"; 

, 그것은 잘 작동 : 내가 생성자에서이 작업을 수행 할 경우

예를 들어, 오류가 발생합니다.

희망이 도움이됩니다. 감사. 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"); 
관련 문제