2010-12-16 5 views
1

Добрый деньКак управлять WebBrowser и управлять документом HTML?

У меня возник вопрос о отображении html-документов в приложениях форм Windows. Приложение, над которым я работаю, должно отображать информацию из базы данных

в формате html. Я попытаюсь описать действия, которые я предпринял (и которые не удалось):

1) Я попытался загрузить «виртуальную» страницу html, которая существует только в памяти и динамически изменяет ее параметры (webbMain - это элемент управления WebBrowser):

public static string CreateBookHtml() 
{ 
StringBuilder sb = new StringBuilder(); 

//Declaration 
sb.AppendLine(@"<?xml version=""1.0"" encoding=""utf-8""?>"); 
sb.AppendLine(@"<?xml-stylesheet type=""text/css"" href=""style.css""?>"); 
sb.AppendLine(@"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.1//EN"" 
        ""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"">"); 
sb.AppendLine(@"<html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"">"); 

//Head 
sb.AppendLine(@"<head>"); 
sb.AppendLine(@"<title>Exemplary document</title>"); 
sb.AppendLine(@"<meta http-equiv=""Content-Type"" content=""application/xhtml+xml; 
                   charset=utf-8""/ >"); 
sb.AppendLine(@"</head>"); 

//Body 
sb.AppendLine(@"<body>"); 
sb.AppendLine(@"<p id=""paragraph"">Example.</p>"); 
sb.AppendLine(@"</body>"); 
sb.AppendLine(@"</html>"); 

return sb.ToString(); 
} 

недействительный LoadBrowser() { this.webbMain.Navigate ("о: пусто"); this.webbMain.DocumentText = CreateBookHtml(); HtmlDocument doc = this.webbMain.Document; }

Это не удалось, поскольку doc.Body имеет значение null, а doc.getElementById ("paragraph") также возвращает значение null. Поэтому я не могу изменить свойство InnerText.

Кроме того, this.webbMain.DocumentText является «\ 0» ...

2) Я пытался создать HTML-файл в указанную папку, загрузить его в WebBrowser, а затем изменить его параметры. Html так же, как созданный

CreateBookHtml() метод:

private void LoadBrowser() 
     { 
      this.webbMain.Navigate("HTML\\BookPage.html"));    
      HtmlDocument doc = this.webbMain.Document; 
     } 

На этот раз this.webbMain.DocumentText содержит данные Html считанных из файла, но doc.Body нуль снова возвращается, и я до сих пор не могу взять элемент, используя

Метод getByElementId(). Конечно, когда у меня есть текст, я бы попробовал регулярное выражение, чтобы получить определенные поля, или, возможно, сделать другие трюки, чтобы достичь цели, но мне интересно - есть ли просто способ maintulate html? Для меня идеальным способом было бы создать HTML-текст в памяти, загрузить его в элемент управления WebBrowser и затем динамически изменять его параметры с помощью идентификаторов. Является ли это возможным? Спасибо за ответы заранее, наилучшими пожеланиями,

Paweł

+0

Там нет способа NavigateToString контроля WebBrowser – Rob 2017-04-09 15:49:51

ответ

6

Я работал некоторое время назад с WebControl и, как вы хотели, чтобы загрузить HTML из памяти, но та же проблема, тело является нулевым. После некоторого расследования я заметил, что методы Navigate и NavigateToString работают асинхронно, поэтому для загрузки документа требуется немного времени, и этот документ недоступен сразу после вызова Navigate. Так что я сделал что-то вроде (wbChat является контролем WebBrowser):

wbChat.NavigateToString("<html><body><div>first line</div></body><html>"); 

DoEvents(); 

где DoEvents() является implemeted как:

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
public void DoEvents() 
{ 
    DispatcherFrame frame = new DispatcherFrame(); 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
       new DispatcherOperationCallback(ExitFrame), frame); 
    Dispatcher.PushFrame(frame); 
} 

и он работал на меня, после того, как DoEvents вызов, я могу получить ненулевое тело:

mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)wbChat.Document; 

mshtml.HTMLDivElement div = (mshtml.HTMLDivElement)doc2.createElement("div"); 
div.innerHTML = "some text"; 
mshtml.HTMLBodyClass body = (mshtml.HTMLBodyClass)doc2.body; 

if (body != null) 
{ 
    body.appendChild((mshtml.IHTMLDOMNode)div); 

    body.scrollTop = body.scrollHeight; 
} 
else 
    Console.WriteLine("body is still null"); 

Я не знаю, если это права способа сделать это, но проблема решена, для меня, может быть, это поможет вам тоже.

Позже Edit:

public object ExitFrame(object f) 
{ 
    ((DispatcherFrame)f).Continue = false; 
    return null; 
} 

Метод DoEvents необходимо на WPF. Для System.Windows.Forms можно использовать Application.DoEvents().

+0

Здравствуйте! Спасибо за ответ. Я хотел бы добавить что-то к этому. Во-первых, должно существовать тело метода ExitFrame. Это выглядит так: ExitFrame (объект f) {((DispatcherFrame) f) .Continue = false; return null;}. Во-вторых, мы должны добавить две сборки в решение: WindowsBase.dll и Microsoft.mshtml.dll. В-третьих: я не смог найти метод NavigateToString в WebBrowser. Самое главное, что ваше решение работает (выглядит ужасно, но работает :)), и я пишу выше только для других читателей. Большое спасибо! – skrzeczowas 2010-12-16 20:20:07

1

Другой способ сделать то же самое:

webBrowser1.DocumentText = "<html><body>blabla<hr/>yadayada</body></html>"; 

это работает без каких-либо дополнительных инициализации