web-dev-qa-db-fra.com

Comment afficher le contenu html d'une chaîne dans le contrôle Webbrowser?

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

56
Anasheh

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>";
101
i100

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.

25
m3z

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.

22
ThunderGr

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.

6
P.W.

Solution simple, j'ai testé est

webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;
4
Hamza Rabbani

webBrowser.NavigateToString (votreChaîne);

3
user1116133

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
2
CrazyIvan1974

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...
        }
    }        
2
Teo Bebekis

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.

0
AOReilly