web-dev-qa-db-ja.com

文字列htmlコンテンツをwebbrowserコントロールに表示する方法は?

C#winアプリプログラムがあります。データベースにhtml形式でテキストを保存しますが、ユーザーにWebブラウザで表示したいのですが、文字列htmlコンテンツをwebbrowserコントロールに表示するにはどうすればよいですか?

前もって感謝します

56
Anasheh

これを試して:

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

Thomas Wがコメントしたように-このコメントはほとんど見逃したが、同じ問題を抱えていたので、答えとして書き直す価値があると思う。

主な問題は、最初の_webBrowser1.DocumentText_を一部のhtmlに割り当てた後、その後の割り当ては効果がなかったことです。

Thomasがリンクしたソリューションの詳細は、 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プロパティの背後にあるコードには、例外もスローするという事実にもかかわらず、この効果を引き起こす別の副作用があると思われます。

とにかく、これが人々の役に立つことを願っています。

25
m3z

空白に移動する代わりに、次のことができます

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

イベントなどを待つ必要はありません。 OpenNewの [〜#〜] msdn [〜#〜] を確認できますが、プロジェクトの1つで最初のDocumentText割り当てをテストし、動作します。

22
ThunderGr

何らかの理由で、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);

私のために毎回働いています。私はそれが誰かを助けることを願っています。

6
P.W.

私がテストしたシンプルなソリューションは

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

webBrowser.NavigateToString(yourString);

3
user1116133

昔の質問ですが、この操作の目的は次のとおりです。

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 event DOES NOT「about:blank」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
2
CrazyIvan1974

ここに小さなコードがあります。 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...
        }
    }        
2
Teo Bebekis

M3zが推奨するDisplayHtml(string html)がうまくいきました。

それが誰かを助ける場合、最初に私のHTMLにHTMLを無効にするいくつかのスペースがあったので、テキストが文字列として表示されたことにも言及したいと思います。 HTMLをVisual Studioに貼り付けたときにスペース(angular角かっこ)が導入されました。したがって、この投稿で説明した解決策を試してもテキストがテキストとして表示される場合は、 HTML構文が正しいことを確認する価値があります。

0
AOReilly