#c# #winforms #dom #webbrowser-control
Вопрос:
Я пытаюсь манипулировать DOM в рамках элемента управления WebBrowser. Однако элемент управления WebBroser, похоже, не отображает никаких обновлений в DOM. У меня есть пара вспомогательных функций, которые помогут упростить мой основной код. Для справки вспомогательными функциями являются:
private HtmlElement CreateChildElement(HtmlElement oParent, string cTag, params string[] aAttrs)
{
// This creates a child element or tag cTag.
// It then loops through aAttrs (of which there must be an even number, or none), which are key-value pairs of attributes.
// In this way it is possible to create an element and its attributes in one line
HtmlElement oNew;
int i;
string cName;
string cValue;
oNew = _doc.CreateElement(cTag);
oParent.AppendChild(oNew);
for (i = 0; i < aAttrs.GetUpperBound(0); i = 2)
{
cName = aAttrs[i];
cValue = aAttrs[i 1];
oNew.SetAttribute(cName, cValue);
}
return oNew;
}
private bool _documentCompleted = false;
private void WaitForHtmlToFinishLoading()
{
while (!_documentCompleted)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") " - waiting");
Application.DoEvents(); // i hate this
}
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") " - loaded");
}
И упрощенная версия моего кода вызова такова:
_documentCompleted = false;
_wb.DocumentCompleted = NotifyDocumentCompleted;
_wb.DocumentText = "<html><head></head><body>sausages</body></html>";
WaitForHtmlToFinishLoading();
_doc = _wb.Document;
oMainTable = CreateChildElement(_doc.Body, "table", "border", "1");
tr = CreateChildElement(oMainTable, "tr");
td = CreateChildElement(tr, "td");
td.InnerText = "beans";
td = CreateChildElement(tr, "td");
td.InnerText = "and peas";
_wb.Refresh(WebBrowserRefreshOption.Completely);
...
public void NotifyDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
_documentCompleted = true;
}
Тем не менее, браузер решительно остается просто отображающим «сосиски» и должен переключиться на отображение таблицы с двумя ячейками: «бобы», «и горох». Кстати, wb.DocumentText
также сохраняет свою старую ценность.
Что мне нужно сделать после того, как я изменю DOM, чтобы браузер заново отобразил обновленную модель документа?
Комментарии:
1.
_wb.DocumentText
не отражает изменений, но_wb.Document.Body.InnerHtml
отражает. Перезагрузка может быть произведена:_wb.DocumentText = string.Format("<html><head></head><body>{0}</body></html>", _doc.Body.InnerHtml);