C#winアプリプログラムがあります。データベースにhtml形式でテキストを保存しますが、ユーザーにWebブラウザで表示したいのですが、文字列htmlコンテンツをwebbrowserコントロールに表示するにはどうすればよいですか?
前もって感謝します
これを試して:
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>";
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プロパティの背後にあるコードには、例外もスローするという事実にもかかわらず、この効果を引き起こす別の副作用があると思われます。
とにかく、これが人々の役に立つことを願っています。
空白に移動する代わりに、次のことができます
webBrowser1.DocumentText="0";
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write(theHTML);
webBrowser1.Refresh();
イベントなどを待つ必要はありません。 OpenNewの [〜#〜] msdn [〜#〜] を確認できますが、プロジェクトの1つで最初のDocumentText割り当てをテストし、動作します。
何らかの理由で、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);
私のために毎回働いています。私はそれが誰かを助けることを願っています。
私がテストしたシンプルなソリューションは
webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;
webBrowser.NavigateToString(yourString);
昔の質問ですが、この操作の目的は次のとおりです。
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
ここに小さなコードがあります。 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...
}
}
M3zが推奨するDisplayHtml(string html)がうまくいきました。
それが誰かを助ける場合、最初に私のHTMLにHTMLを無効にするいくつかのスペースがあったので、テキストが文字列として表示されたことにも言及したいと思います。 HTMLをVisual Studioに貼り付けたときにスペース(angular角かっこ)が導入されました。したがって、この投稿で説明した解決策を試してもテキストがテキストとして表示される場合は、 HTML構文が正しいことを確認する価値があります。