J'ai un programme d'application c # win. J'enregistre le texte au format HTML dans ma base de données, mais je souhaite l'afficher dans un navigateur Web à mon utilisateur. Comment afficher le contenu de chaîne html dans le contrôle du navigateur Web?
merci d'avance
Essaye ça:
webBrowser1.DocumentText =
"<html><body>Please enter your name:<br/>" +
"<input type='text' name='userName'/><br/>" +
"<a href='http://www.Microsoft.com'>continue</a>" +
"</body></html>";
Comme l'a commenté Thomas W. - J'ai failli rater ce commentaire, mais j'avais les mêmes problèmes, il est donc intéressant de le réécrire en tant que réponse, je pense.
Le problème principal est qu'après la première affectation de webBrowser1.DocumentText
À du code HTML, les affectations suivantes n'ont aucun effet.
La solution liée par Thomas peut être trouvée en détail à l’adresse http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/displaying-custom-html-in-webbrowser-control.aspx Je résumerai cependant ci-dessous au cas où cette page deviendrait indisponible à l'avenir.
En bref, en raison du fonctionnement du contrôle webBrowser, vous devez accéder à une nouvelle page chaque fois que vous souhaitez modifier le contenu. Par conséquent, l'auteur propose une méthode pour mettre à jour le contrôle en tant que:
private void DisplayHtml(string html)
{
webBrowser1.Navigate("about:blank");
if (webBrowser1.Document != null)
{
webBrowser1.Document.Write(string.Empty);
}
webBrowser1.DocumentText = html;
}
J'ai toutefois constaté que dans mon application actuelle, je reçois une exception CastException à partir de la ligne if(webBrowser1.Document != null)
. Je ne suis pas sûr de savoir pourquoi, mais j'ai constaté que si j'emballe le bloc entier if
dans un essai, l'effet souhaité est toujours valable. Voir:
private void DisplayHtml(string html)
{
webBrowser1.Navigate("about:blank");
try
{
if (webBrowser1.Document != null)
{
webBrowser1.Document.Write(string.Empty);
}
}
catch (CastException e)
{ } // do nothing with this
webBrowser1.DocumentText = html;
}
Ainsi, chaque fois que la fonction DisplayHtml
est exécutée, je reçois un CastException
à partir de l'instruction if
, de sorte que le contenu de l'instruction if n'est jamais atteint. Cependant, si je commente l'instruction if
afin de ne pas recevoir le message CastException
, le contrôle du navigateur ne sera pas mis à jour. Je soupçonne qu'il existe un autre effet secondaire du code derrière la propriété Document qui provoque cet effet malgré le fait qu'il génère également une exception.
Quoi qu'il en soit, j'espère que cela aide les gens.
Au lieu de naviguer à blanc, vous pouvez faire
webBrowser1.DocumentText="0";
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write(theHTML);
webBrowser1.Refresh();
Pas besoin d'attendre des événements ou quoi que ce soit d'autre. Vous pouvez vérifier le MSDN pour OpenNew, alors que j'ai testé l'affectation initiale DocumentText dans l'un de mes projets et que cela fonctionne.
Pour une raison quelconque, le code fourni par m3z (avec la méthode DisplayHtml(string)
) ne fonctionne pas dans mon cas (sauf la première fois). J'affiche toujours du HTML à partir d'une chaîne. Voici ma version après la bataille avec le contrôle WebBrowser:
webBrowser1.Navigate("about:blank");
while (webBrowser1.Document == null || webBrowser1.Document.Body == null)
Application.DoEvents();
webBrowser1.Document.OpenNew(true).Write(html);
Travailler chaque fois pour moi. J'espère que ça aide quelqu'un.
Solution simple, j'ai testé est
webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;
webBrowser.NavigateToString (votreChaîne);
Vieille question, mais voici mon choix pour cette opération.
If browser.Document IsNot Nothing Then
browser.Document.OpenNew(True)
browser.Document.Write(My.Resources.htmlTemplate)
Else
browser.DocumentText = My.Resources.htmlTemplate
End If
Et assurez-vous que tout browser.Navigating
event NE NE PAS FAIRE annuler les URL "à propos de: vierges". Exemple d'événement ci-dessous pour le contrôle total de WebBrowser
navigation.
Private Sub browser_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles browser.Navigating
Try
Me.Cursor = Cursors.WaitCursor
Select Case e.Url.Scheme
Case Constants.App_Url_Scheme
Dim query As Specialized.NameValueCollection = System.Web.HttpUtility.ParseQueryString(e.Url.Query)
Select Case e.Url.Host
Case Constants.Navigation.URLs.ToggleExpander.Host
Dim nodeID As String = query.Item(Constants.Navigation.URLs.ToggleExpander.Parameters.NodeID)
:
:
<other operations here>
:
:
End Select
Case Else
e.Cancel = (e.Url.ToString() <> "about:blank")
End Select
Catch ex As Exception
ExceptionBox.Show(ex, "Operation failed.")
Finally
Me.Cursor = Cursors.Default
End Try
End Sub
Voici un petit code. Cela fonctionne (pour moi) lors de tout changement de code HTML ultérieur du contrôle WebBrowser. Vous pouvez l'adapter à vos besoins spécifiques.
static public void SetWebBrowserHtml(WebBrowser Browser, string HtmlText)
{
if (Browser != null)
{
if (string.IsNullOrWhiteSpace(HtmlText))
{
// Putting a div inside body forces control to use div instead of P (paragraph)
// when the user presses the enter button
HtmlText =
@"<html>
<head>
<meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
</head>
<div></div>
<body>
</body>
</html>";
}
if (Browser.Document == null)
{
Browser.Navigate("about:blank");
//Wait for document to finish loading
while (Browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
System.Threading.Thread.Sleep(5);
}
}
// Write html code
dynamic Doc = Browser.Document.DomDocument;
Doc.open();
Doc.write(HtmlText);
Doc.close();
// Add scripts here
/*
dynamic Doc = Document.DomDocument;
dynamic Script = Doc.getElementById("MyScriptFunctions");
if (Script == null)
{
Script = Doc.createElement("script");
Script.id = "MyScriptFunctions";
Script.text = JavascriptFunctionsSourcecode;
Doc.appendChild(Script);
}
*/
// Enable contentEditable
/*
if (Browser.Document.Body != null)
{
if (Browser.Version.Major >= 9)
Browser.Document.Body.SetAttribute("contentEditable", "true");
}
*/
// Attach event handlers
// Browser.Document.AttachEventHandler("onkeyup", BrowserKeyUp);
// Browser.Document.AttachEventHandler("onkeypress", BrowserKeyPress);
// etc...
}
}
Le DisplayHtml (chaîne html) recommandé par m3z a fonctionné pour moi.
Au cas où cela pourrait aider quelqu'un, j'aimerais également mentionner qu'au départ, certains espaces de mon code HTML invalidaient le code HTML et que le texte apparaissait alors sous forme de chaîne. Les espaces ont été introduits (autour des crochets angular) lorsque j'ai collé le code HTML dans Visual Studio. Par conséquent, si votre texte apparaît toujours en tant que texte après avoir essayé les solutions mentionnées dans cet article, il est possible que Cela vaut la peine de vérifier que la syntaxe HTML est correcte.