C# 如何在webbrowser控件中显示字符串html内容?

C# 如何在webbrowser控件中显示字符串html内容?,c#,browser,C#,Browser,我有一个c#win应用程序程序。我在数据库中以html格式保存文本,但我想在webbrowser中向用户显示它。如何在webbrowser控件中显示字符串html内容 提前感谢试试这个: webBrowser1.DocumentText = "<html><body>Please enter your name:<br/>" + "<input type='text' name='userName'/><br/>" +

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

提前感谢

试试这个:

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>";
webBrowser1.DocumentText=
“请输入您的姓名:
”+ “
”+ "" + "";
webBrowser.NavigateToString(您的字符串)

正如Thomas W.所评论的那样-我几乎错过了这条评论,但我也有同样的问题,所以我认为这是值得重写的答案

主要问题是,在将
webBrowser1.DocumentText
首次分配给某些html之后,后续分配没有任何效果

由Thomas链接的解决方案可以在中找到详细信息,但我将在下面进行总结,以防将来无法使用此页面

简而言之,由于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。我不确定这是为什么,但我发现如果我在try-catch中包装整个
if
块,所需的效果仍然有效。见:

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
函数时,我都会从
if
语句中收到一个
CastException
,因此永远不会到达if语句的内容。但是,如果我注释掉
if
语句以便不接收
CastException
,则浏览器控件不会得到更新。我怀疑Document属性后面的代码还有另一个副作用,尽管它也抛出了一个异常,但仍然会导致这种影响


无论如何,我希望这能帮助人们。

出于某种原因,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);

每次都为我工作。我希望它能帮助别人。

你可以这样做,而不是导航到blank

webBrowser1.DocumentText="0";
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write(theHTML);
webBrowser1.Refresh();

无需等待事件或其他任何事情。您可以检查OpenNew,而我已经在我的一个项目中测试了初始DocumentText分配,并且它工作正常。

这里是一段小代码。它(对我来说)在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...
        }
    }        
static public void SetWebBrowserHtml(WebBrowser浏览器,字符串HtmlText)
{
如果(浏览器!=null)
{
if(string.IsNullOrWhiteSpace(HtmlText))
{
//将div放在body中会强制控件使用div而不是P(段落)
//当用户按下enter按钮时
HtmlText=
@"
";
}
如果(Browser.Document==null)
{
浏览。导航(“关于:空白”);
//等待文档完成加载
while(Browser.ReadyState!=WebBrowserReadyState.Complete)
{
Application.DoEvents();
系统。线程。线程。睡眠(5);
}
}
//编写html代码
动态文档=Browser.Document.DomDocument;
Doc.open();
文件写入(HtmlText);
Doc.close();
//在此处添加脚本
/*  
动态单据=Document.DomDocument;
动态脚本=Doc.getElementById(“MyScriptFunctions”);
如果(脚本==null)
{
脚本=Doc.createElement(“脚本”);
Script.id=“MyScriptFunctions”;
Script.text=JavascriptFunctionsSourcecode;
追加子文档(脚本);
}                 
*/
//启用可编辑的内容
/*  
if(Browser.Document.Body!=null)
{
如果(Browser.Version.Major>=9)
Browser.Document.Body.SetAttribute(“contentEditable”、“true”);
}             
*/
//附加事件处理程序
//Browser.Document.AttachEventHandler(“onkeyup”,BrowserKeyUp);
//Browser.Document.AttachEventHandler(“onkeypress”,BrowserKeyPress);
//等等。。。
}
}        

我测试过的简单解决方案是

webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;
webBrowser1.Refresh();
var str=“”+sender.ToString()+”;
webBrowser1.DocumentText=str;
m3z推荐的DisplayHtml(字符串html)对我很有用


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

旧问题,但这是我的操作步骤

If browser.Document IsNot Nothing Then
    browser.Document.OpenNew(True)
    browser.Document.Write(My.Resources.htmlTemplate)
Else
    browser.DocumentText = My.Resources.htmlTemplate
End If
确保任何
浏览器。导航
事件不会取消“关于:空白”URL。下面的事件示例用于完全控制
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
Private子浏览器\u导航(发件人作为对象,e作为WebBrowserNavigatingEventArgs)处理浏览器。导航
尝试
Me.Cursor=Cursors.WaitCursor
选择Case e.Url.Scheme
Case Constants.App\u Url\u方案
Dim查询为Specialized.NameValueCollection=System.Web.HttpUtility。