Элемент управления .NET WebBrowser, по-видимому, не имеет метода, позволяющего вставлять html-элементы из их строки в тело документа, поскольку для метода AppendChild
требуется тип HtmlElement
. В следующем коде я пытаюсь преодолеть это, поскольку Document.Body
возвращает тип HtmlElement
, поэтому я создаю новый элемент управления WebBrowser, присваивая тексту все тело, а затем получаю результат как HtmlElement
.
Контрольный код
public class WebBrowserEx : WebBrowser {
// method to allow creation of HtmlElement from HTML text
public HtmlElement CreateElement(string html)
{
HtmlElement el;
using(WebBrowser wb = new WebBrowser())
{
wb.Navigate("about:blank");
try
{
if (wb.Document != null) { wb.Document.Write(string.Empty); }
} catch (InvalidCastException) { }
wb.Document.Write(html);
el = wb.Document.Body;
}
return el;
}
// method to set entire document from HTML text
public string Html {
get {
return DocumentText;
}
set{
Navigate("about:blank");
try
{
if (Document != null) { Document.Write(string.Empty); }
} catch (InvalidCastException) { }
wb.Document.Write(html);
}
}
}
Пример использования
using System;
using System.Windows.Forms;
public partial class Form1 : Form {
public Form1()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e )
{
// create a new instance of the WebBrowserEx control
WebBrowserEx wbex = new WebBrowserEx();
// set the document to HTML content
wbex.Html = "<html><head></head><body></body></html>";
// create a new element from HTML as string
HtmlElement el = wbex.CreateElement("<h1>Hello World</h1><br>");
// append new element to document
wbex.Document.Body.AppendChild(el);
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь добавить этот результат, используя Document.Body.AppendChild
, это дает мне следующее исключение:
Значение не попадает в ожидаемый диапазон.
Это также дает то же исключение при попытке вставить элемент, используя
wbex.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.AfterEnd, el);
Изображение исключения
Примечание
Мне известно о добавлении отдельных элементов, используя Document.CreateElement("A")
, где «A» - элемент, однако это не позволяет добавлять блок html, который содержит много элементов. Я также знаю, что могу вставлять JavaScript и запускать его на лету, с помощью которого вы также можете создавать элементы. Мне также известно, что я мог бы просто сохранить свой HTML-код в строке, добавить к нему и затем снова установить html документа, однако это потеряло бы любое существующее состояние или динамические изменения на странице.
Цель состоит в том, чтобы иметь возможность просто добавить блок html из строки в любое место существующего html-документа, который уже загружен непосредственно в элемент управления WebBrowser.