2008-10-06 10 views
35

En mi programa vb.net, estoy usando un navegador web para mostrar al usuario una vista previa HTML. Anteriormente estaba presionando un servidor para tomar el HTML, luego volviendo a un hilo asincrónico y generando un evento para llenar el WebBrowser.DocumentText con la cadena HTML que estaba devolviendo..Net WebBrowser.DocumentText no está cambiando!

Ahora lo configuré para capturar toda la información en el cliente, sin tener que golpear el servidor, y estoy tratando de plantear el mismo evento. Puedo ver el código pasar, y tiene la cadena HTML correcto y todo, pero cuando trato de hacer

browser.DocumentText = _emailHTML 

el contenido de DocumentText permanecer como "<HTML></HTML>"

Me preguntaba por qué el DocumentText no estaba siendo establecido. ¿Alguien tiene alguna sugerencia?

Respuesta

49

intente lo siguiente:

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

He encontrado que el control WebBrowser por lo general tiene que ser inicializado a about:blank de todos modos. Lo mismo debe hacerse entre navega a diferentes tipos de contenido (como texto/xml a texto/html) porque el procesador es diferente (mshtml para texto/html, algo más para texto/xml).

(a través de http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx)

+5

Agradezco la ayuda. Resulta que pude obtenerlo con browser.Document.OpenNew (Verdadero) Tiene razón, necesitaba inicializarlo. –

+1

Increíble. Buen encantamiento. –

+2

¿Por qué doc.Write seguido de DocumentText = ...? ¿No es suficiente solo hacer un browser.Document.Write (_emailHTML) ;? – Nikodemus

1

sólo vio esto en algunos de nuestro viejo código.

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

Application.DoEvents(); 

al parecer un DoEvents también manda el navegador en representación

+0

No es sorprendente que esto funcione, pero recomendaría evitar el uso de DoEvents cuando sea posible. Le dice al ciclo de mensaje que detenga todo y que procese todos los mensajes en la cola. Ver http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html. –

0

Mientras Application.DoEvents() fijarlo en un proyecto Windows Forms, que era irrelevante en un proyecto de WPF.

Finalmente lo tengo a trabajar usando webBrowser.Write(htmlContent) (en lugar de webBrowser.DocumentText = htmlContent).

0

Esto siempre funciona

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

me encontré con el siguiente y funcionó!

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

Este es el que funcionó para mí. Lo único que me faltaba era la actualización. –

+0

Funciona como un encanto ... incluso con AllowNav = false –

+1

Desafortunadamente, esto no generará el evento 'DocumentCompleted'. –

0

Asegúrese de que usted no cancela Navegación caso de WebBrowser para about: blank página. WebBrowser navega a acerca de: en blanco antes de establecer DocumentText. Así que si usted quiere manejar enlaces por sí mismo que necesita para crear siguiente controlador de Navegación evento:

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

He encontrado la mejor manera de manejar esto, es el siguiente:

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

recuerde poner el refresco() en el bloque else. – ThunderGr

1

Eso funcionó para mí:

webBrowser.Navigate("about:blank"); 
webBrowser.Document?.Write(htmlString); 
Cuestiones relacionadas