У меня есть программа для запуска С# win. Я сохраняю текст в формате html в моей базе данных, но хочу показать его в веб-браузере своему пользователю. Как отобразить содержимое html строки в элементе управления webbrowser?
заблаговременно
У меня есть программа для запуска С# win. Я сохраняю текст в формате html в моей базе данных, но хочу показать его в веб-браузере своему пользователю. Как отобразить содержимое 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>";
Как прокомментировал Томас У. - я почти пропустил этот комментарий, но у меня были те же проблемы, поэтому стоит переписывать как ответ, который я думаю.
Основная проблема заключается в том, что после первого присвоения 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;
}
Однако я обнаружил, что в моем текущем приложении я получаю CastException из строки if(webBrowser1.Document != null)
. Я не уверен, почему это так, но я обнаружил, что если я завершу весь блок if
в попытке поймать желаемый эффект, все равно будет работать. См:
private void DisplayHtml(string html)
{
webBrowser1.Navigate("about:blank");
try
{
if (webBrowser1.Document != null)
{
webBrowser1.Document.Write(string.Empty);
}
}
catch (Exception 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();
Не нужно ждать событий или чего-то еще. Вы можете проверить MSDN для OpenNew, в то время как я тестировал начальное назначение 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);
Вот небольшой код. Он работает (для меня) при любой последующей смене HTML-кода элемента управления WebBrowser. Вы можете адаптировать его к вашим конкретным потребностям.
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...
}
}
Для меня работал DisplayHtml (строка html), рекомендованный m3z.
В случае, если это помогает кому-то, я также хотел бы упомянуть, что изначально в моем HTML были некоторые пробелы, которые недействительны для HTML, и поэтому текст появился как строка. Пробелы были введены (вокруг скобок angular), когда я вставлял HTML в Visual Studio. Поэтому, если ваш текст по-прежнему отображается как текст после того, как вы попытаетесь найти решения, упомянутые в этом сообщении, возможно, стоит проверить правильность синтаксиса HTML.