Как отобразить содержимое строки html в элемент управления webbrowser? - PullRequest
55 голосов
/ 19 марта 2011

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

заранее спасибо

Ответы [ 9 ]

100 голосов
/ 19 марта 2011

Попробуйте это:

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>";
25 голосов
/ 03 декабря 2013

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

Основная проблема заключается в том, что после первого присвоения 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 (CastException e)
    { } // do nothing with this
    webBrowser1.DocumentText = html;
}

Таким образом, каждый раз, когда выполняется функция DisplayHtml, я получаю CastException от оператора if, поэтому содержимое оператора if никогда не достигается. Однако если я закомментирую оператор if, чтобы не получить CastException, то элемент управления браузера не будет обновлен. Я подозреваю, что есть другой побочный эффект кода за свойством Document, который вызывает этот эффект, несмотря на то, что он также вызывает исключение.

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

22 голосов
/ 19 мая 2014

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

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

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

6 голосов
/ 14 марта 2014

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

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

4 голосов
/ 23 апреля 2016

Простое решение, я проверял это

webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;
3 голосов
/ 28 февраля 2013

webBrowser.NavigateToString (yourString);

2 голосов
/ 02 июля 2018

Старый вопрос, но вот мое решение для этой операции.

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 событие НЕ отменяет URL-адреса about: blank. Пример события ниже для полного контроля 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 голосов
/ 14 апреля 2015

Вот небольшой код.Это работает (для меня) при любом последующем изменении 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...
        }
    }        
0 голосов
/ 20 апреля 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...