2008-10-06 25 views
35

Trong chương trình vb.net của tôi, tôi đang sử dụng trình duyệt web để hiển thị cho người dùng bản xem trước HTML. Trước đây tôi đã đánh một máy chủ để lấy HTML, sau đó trở về một chuỗi không đồng bộ và nâng cao một sự kiện để điền vào WebBrowser.DocumentText với chuỗi HTML mà tôi đã quay trở lại..Net WebBrowser.DocumentText không thay đổi!

Bây giờ tôi đã thiết lập để lấy tất cả thông tin trên máy khách, mà không cần phải nhấn máy chủ, và tôi đang cố gắng nâng cao cùng một sự kiện. Tôi xem mã đi qua, và nó có chuỗi HTML chính xác và tất cả mọi thứ, nhưng khi tôi cố gắng làm

browser.DocumentText = _emailHTML 

nội dung của DocumentText vẫn là "<HTML></HTML>"

Tôi chỉ thắc mắc tại sao DocumentText đã không được thiết lập. Bất cứ ai có bất cứ đề nghị?

Trả lời

49

Hãy thử như sau:

browser.Navigate("about:blank"); 
HtmlDocument doc = browser.Document; 
doc.Write(String.Empty); 
browser.DocumentText = _emailHTML; 

Tôi đã phát hiện ra rằng WebBrowser kiểm soát thường cần phải được khởi tạo about:blank anyway. Cần phải thực hiện tương tự giữa các điều hướng đến các loại nội dung khác nhau (như văn bản/xml thành văn bản/html) vì trình kết xuất khác (mshtml cho văn bản/html, cái gì khác cho văn bản/xml).

(qua http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx)

+5

Tôi đánh giá cao sự trợ giúp. Hóa ra tôi có thể tải xuống bằng trình duyệt.Document.OpenNew (True) Bạn nói đúng - tôi cần khởi tạo nó. –

+1

Tuyệt vời. Đẹp câu thần chú. –

+2

Tại sao doc.Write theo sau là DocumentText = ...? Nó không đủ để làm một trình duyệt.Document.Write (_emailHTML) ;? – Nikodemus

1

Chỉ cần phát hiện điều này trong một số mã cũ của chúng tôi.

_webBrowser.DocumentText = builder.WriteToString(...); 

Application.DoEvents(); 

Rõ ràng một DoEvents cũng đá trình duyệt vào render

+0

Nó không phải là đáng ngạc nhiên rằng điều này có thể làm việc, nhưng tôi khuyên bạn nên tránh sử dụng DoEvents khi có thể. Nó báo cho vòng lặp tin nhắn dừng mọi thứ và xử lý tất cả các tin nhắn trong hàng đợi. Xem http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html. –

0

Trong khi Application.DoEvents() sửa chữa nó trong một dự án WinForms, đó là không thích hợp trong một dự án WPF.

Cuối cùng tôi đã làm việc này bằng cách sử dụng webBrowser.Write(htmlContent) (thay vì webBrowser.DocumentText = htmlContent).

0

luôn này hoạt động

using mshtml; 


private IHTMLDocument2 Document 
{ 
    get 
    { 
     if (Browser.Document != null) 
     { 
      return Browser.Document.DomDocument as IHTMLDocument2; 
     } 

     return null; 
    } 
} 


if (Document == null) 
{ 
    Browser.DocumentText = Contents; 
} 
else 
{ 
    Document.body.innerHTML = Contents; 
} 
31

Tôi tìm thấy sau đây và nó làm việc!

webBrowser.Navigate("about:blank"); 
    webBrowser.Document.OpenNew(false); 
    webBrowser.Document.Write(html); 
    webBrowser.Refresh(); 
+1

Đây là một trong đó làm việc cho tôi. Điều duy nhất tôi đã bỏ lỡ là làm mới. –

+0

Làm việc như một sự quyến rũ ... ngay cả với AllowNav = false –

+1

Thật không may điều này sẽ không làm tăng sự kiện 'DocumentCompleted'. –

0

Hãy chắc chắn rằng bạn không hủy Duyệt trường hợp WebBrowser cho about: blank trang. WebBrowser điều hướng đến về: trống trước khi đặt DocumentText. Vì vậy, nếu bạn muốn xử lý liên kết bởi bản thân bạn cần phải tạo ra sau xử lý của Duyệt sự kiện:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    if(e.Url.OriginalString.StartsWith("about:")) 
    { 
     return; 
    } 
    e.Cancel = true; 
    // ... 
} 
8

tôi thấy cách tốt nhất để xử lý này được quy định như sau:

if (this.webBrowser1.Document == null) 
{ 
    this.webBrowser1.DocumentText = htmlSource; 
} 
else 
{ 
    this.webBrowser1.Document.OpenNew(true); 
    this.webBrowser1.Document.Write(htmlSource); 
} 
+0

hãy nhớ đặt Làm mới() trong khối khác. – ThunderGr

1

Đó đã làm việc cho tôi:

webBrowser.Navigate("about:blank"); 
webBrowser.Document?.Write(htmlString); 
Các vấn đề liên quan