Веб-браузер C# — как заставить веб-браузер показывать обновления для DOM

#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);