2011-11-15 41 views
8

Tôi có một tài liệu WebBrowser được đặt ở chế độ chỉnh sửa. Tôi đang cố gắng thao tác văn bản bên trong của phần tử cơ thể bằng cách sử dụng WebBrowser.Document.Body.InnerText, tuy nhiên, WebBrowser.Document.Body vẫn không có giá trị.WebBrowser.Document.Body luôn là null

Đây là mã mà tôi tạo ra các nội dung tài liệu:

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

tôi có thể chỉnh sửa mã và tất cả mọi thứ tốt đẹp, nhưng tôi không hiểu tại sao HtmlEditor.Document.Body vẫn null. Tôi biết tôi luôn có thể chỉ cần đặt lại phần thân tài liệu bất cứ khi nào tôi cần tải văn bản vào biểu mẫu, nhưng tôi muốn hiểu tại sao điều này là hành xử theo cách của nó, nếu không có gì khác thì cho kiến ​​thức.

Bất kỳ trợ giúp nào về điều này được đánh giá cao.

+0

bạn sẽ xin hãy nhìn vào liên kết này http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx?msg=2478179 –

+0

không có súc sắc, tôi được đăng ở đây sau khi đọc bài viết đó –

+0

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

Trả lời

5

Bạn phải đợi sự kiện DocumentCompleted của Trình duyệt web để kích hoạt số DomDocument.Body không bị vô hiệu. Tôi chỉ thử nghiệm này để xác minh. Tôi cho rằng câu hỏi vẫn còn: bạn có thể chỉnh sửa thông qua giao diện COM cơ bản khi tài liệu chưa được tải hoàn toàn như thế nào?

Tôi đã kiểm tra xem các con trỏ IHTMLDocument2 có giống nhau trong DocumentCompleted và hàm tạo hay không. Chúng có thể chỉ ra rằng đối tượng COM bên dưới sẽ tái sử dụng một đối tượng tài liệu HTML duy nhất. Nó có vẻ như bất kỳ thay đổi bạn thực hiện trong constructor ít nhất có một cơ hội khá tốt của việc ghi đè hoặc ném một ngoại lệ.

Ví dụ, nếu tôi làm điều này trong các nhà xây dựng, tôi nhận được một lỗi:

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

p1.title = "Hello world!"; 

Nếu tôi làm như vậy trong một handler DocumentCompleted, nó hoạt động tốt.

Hy vọng điều này sẽ hữu ích. Cảm ơn.

2

Sử dụng DocumentCompleted kiện đầu tiên, nó xảy ra khi sự kiểm soát WebBrowser kết thúc tải một tài liệu:

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

hoặc cách đơn giản:

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

Bạn cần để cho các WebBrowser kiểm soát để làm việc một mình một chút để dành thời gian để thiết lập thuộc tính Document.Body.

Tôi làm điều đó bằng cách gọi Application.DoEvents();.

Ví dụ trong mã của bạn:

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"); 
Các vấn đề liên quan