Как отобразить содержимое строки html в элементе управления webbrowser? - программирование
Подтвердить что ты не робот

Как отобразить содержимое строки html в элементе управления webbrowser?

У меня есть программа для запуска С# win. Я сохраняю текст в формате html в моей базе данных, но хочу показать его в веб-браузере своему пользователю. Как отобразить содержимое html строки в элементе управления webbrowser?

заблаговременно

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Как прокомментировал Томас У. - я почти пропустил этот комментарий, но у меня были те же проблемы, поэтому стоит переписывать как ответ, который я думаю.

Основная проблема заключается в том, что после первого присвоения 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, который вызывает этот эффект, несмотря на то, что он также генерирует исключение.

В любом случае я надеюсь, что это поможет людям.

Ответ 3

Вместо перехода к пробелу вы можете сделать

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

Не нужно ждать событий или чего-то еще. Вы можете проверить MSDN для OpenNew, в то время как я тестировал начальное назначение DocumentText в одном из моих проектов и работает.

Ответ 4

По какой-то причине код, предоставленный 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);

Работаю каждый раз для меня. Надеюсь, это поможет кому-то.

Ответ 5

Простое решение, которое я тестировал,

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

Ответ 6

webBrowser.NavigateToString(yourString);

Ответ 7

Вот небольшой код. Он работает (для меня) при любой последующей смене 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...
        }
    }        

Ответ 8

Для меня работал DisplayHtml (строка html), рекомендованный m3z.

В случае, если это помогает кому-то, я также хотел бы упомянуть, что изначально в моем HTML были некоторые пробелы, которые недействительны для HTML, и поэтому текст появился как строка. Пробелы были введены (вокруг скобок angular), когда я вставлял HTML в Visual Studio. Поэтому, если ваш текст по-прежнему отображается как текст после того, как вы попытаетесь найти решения, упомянутые в этом сообщении, возможно, стоит проверить правильность синтаксиса HTML.