2008-10-06 8 views
35

Dans mon programme vb.net, j'utilise un webbrowser pour montrer à l'utilisateur un aperçu HTML. Auparavant, je tapais sur un serveur pour récupérer le code HTML, puis revenais sur un thread asynchrone et levait un événement pour remplir le WebBrowser.DocumentText avec la chaîne HTML que je renvoyais..Net WebBrowser.DocumentText ne change pas!

Maintenant, je l'ai mis en place pour saisir toutes les informations sur le client, sans jamais avoir à frapper le serveur, et j'essaye de soulever le même événement. Je regarde le code de passer, et il a la chaîne HTML correct et tout, mais lorsque je tente de faire

browser.DocumentText = _emailHTML 

le contenu de DocumentText rester comme « <HTML></HTML> »

Je me demandais pourquoi le DocumentText n'était pas en train d'être Quelqu'un a des suggestions?

Répondre

49

les opérations suivantes:

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

J'ai trouvé que le besoin habituellement contrôle WebBrowser être initialisé à about:blank de toute façon. La même chose doit être faite entre naviguer vers différents types de contenu (comme text/xml to text/html) car le rendu est différent (mshtml pour text/html, quelque chose d'autre pour text/xml).

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

+5

J'apprécie l'aide. Il s'avère que j'ai été en mesure de l'obtenir avec browser.Document.OpenNew (True) Vous avez raison - j'avais besoin de l'initialiser. –

+1

Incroyable. Belle incantation. –

+2

Pourquoi le doc.Write suivi de DocumentText = ...? Ne suffit-il pas de faire un navigateur.Document.Write (_emailHTML) ;? – Nikodemus

1

Juste repéré cela dans une partie de notre ancien code.

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

Application.DoEvents(); 

Apparemment, un DoEvents aussi le navigateur donne le coup dans le rendu

+0

Il n'est pas surprenant que cela puisse fonctionner, mais je vous recommande d'éviter d'utiliser DoEvents lorsque cela est possible. Il indique à la boucle de message d'arrêter tout et de traiter tous les messages dans la file d'attente. Voir http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html. –

0

Alors que Application.DoEvents() le fixer dans un projet WinForms, il était hors de propos dans un projet WPF. J'ai enfin réussi à l'utiliser en utilisant webBrowser.Write(htmlContent) (au lieu de webBrowser.DocumentText = htmlContent).

0

Ce toujours fonctionne

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

J'ai trouvé ce qui suit et cela a fonctionné!

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

C'est celui qui a fonctionné pour moi. La seule chose qui me manquait était le rafraîchissement. –

+0

Fonctionne comme un charme ... même avec AllowNav = false –

+1

Malheureusement, cela ne déclenchera pas l'événement 'DocumentCompleted'. –

0

Assurez-vous que vous ne résiliez pas Navigation événement de WebBrowser pour about: blank Page. WebBrowser navigue jusqu'à environ: vide avant de définir DocumentText. Donc, si vous voulez gérer les liens par vous-même, vous devez créer la suite gestionnaire de Navigation événement:

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

J'ai trouvé la meilleure façon de gérer cela, est la suivante:

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

n'oubliez pas de mettre le Refresh() dans le bloc else. – ThunderGr

1

Ce travaillé pour moi:

webBrowser.Navigate("about:blank"); 
webBrowser.Document?.Write(htmlString); 
Questions connexes