如何将字符串html内容显示到webbrowser控件中?

时间:2011-03-19 14:08:17

标签: c# browser

我有一个c#win app程序。我在我的数据库中用html格式保存文本,但我想在webbrowser中向我的用户显示它。如何将字符串html内容显示到webbrowser控件中?

提前致谢

9 个答案:

答案 0 :(得分:100)

试试这个:

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

答案 1 :(得分:25)

正如Thomas W.所评论的那样 - 我几乎错过了这个评论,但我遇到了同样的问题,所以我认为值得重写作为答案。

主要问题是,在第一次将webBrowser1.DocumentText分配给某些HTML后,后续分配无效。

托马斯关联的解决方案可以在http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/displaying-custom-html-in-webbrowser-control.aspx详细找到,但是如果将来这个页面不可用,我将在下面总结。

简而言之,由于webBrowser控件的工作方式,每次要更改内容时都必须导航到新页面。因此,作者提出了一种更新控件的方法:

private void DisplayHtml(string html)
{
    webBrowser1.Navigate("about:blank");
    if (webBrowser1.Document != null)
    {
        webBrowser1.Document.Write(string.Empty);
    }
    webBrowser1.DocumentText = html;
}

但我发现在我当前的应用程序中,我从行if(webBrowser1.Document != null)获得了一个CastException。我不确定为什么会这样,但我发现如果我将整个if块包装在try catch中,那么期望的效果仍然有效。参见:

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;
}

因此,每次执行DisplayHtml函数时,我都会从CastException语句中收到if,因此永远不会达到if语句的内容。但是,如果我注释掉if语句以便不接收CastException,则浏览器控件不会更新。我怀疑Document属性背后的代码有另一个副作用导致了这种效果,尽管它也会引发异常。

无论如何,我希望这有助于人们。

答案 2 :(得分:21)

您可以执行

,而不是导航到空白
webBrowser1.DocumentText="0";
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write(theHTML);
webBrowser1.Refresh();

无需等待事件或其他任何事情。您可以检查MSDN是否有OpenNew,而我已在其中一个项目中测试了初始DocumentText分配,但它确实有效。

答案 3 :(得分:6)

由于某些原因,m3z(使用DisplayHtml(string)方法)提供的代码在我的情况下不起作用(第一次除外)。我总是从字符串中显示html。这是我与WebBrowser控件的战斗后的版本:

webBrowser1.Navigate("about:blank");
while (webBrowser1.Document == null || webBrowser1.Document.Body == null)
    Application.DoEvents();
webBrowser1.Document.OpenNew(true).Write(html);

每次为我工作。我希望它有所帮助。

答案 4 :(得分:4)

简单的解决方案,我已经测试过了

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

答案 5 :(得分:3)

webBrowser.NavigateToString(yourString);

答案 6 :(得分:2)

这是一个小代码。它适用于(对我来说)WebBrowser控件的任何后续html代码更改。您可以根据自己的特定需求进行调整。

    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...
        }
    }        

答案 7 :(得分:2)

旧问题,但这是我进行此操作的必经之路。

If browser.Document IsNot Nothing Then
    browser.Document.OpenNew(True)
    browser.Document.Write(My.Resources.htmlTemplate)
Else
    browser.DocumentText = My.Resources.htmlTemplate
End If

并且并确保任何browser.Navigating事件不会取消“ about:blank”网址。以下示例事件可完全控制WebBrowser的导航。

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

答案 8 :(得分:0)

m3z推荐的DisplayHtml(字符串html)为我工作。

如果它对某人有帮助,我还想提一下,我的HTML中最初有一些空格使HTML无效,因此文本显示为字符串。当我将HTML粘贴到Visual Studio中时,引入了空格(在尖括号周围)。因此,如果在尝试本文中提到的解决方案后,您的文本仍然显示为文本,则可能需要检查HTML语法是否正确。