Как вставить новую строку в таблицу в элементе управления WebBrowser

#c# #.net #winforms #webbrowser-control

#c# #.net #winforms #webbrowser-control

Вопрос:

Я добавил следующее содержимое в WebBrowser элемент управления в форме Load :

 private void Form1_Load(object sender, EventArgs e)
{
    addFirst();
}
private void addfirst()
{
    string html = "<!DOCTYPE html>";
    html  = "<html><head><title>NewPage</title>";
    html  = "<style>";
    html  = "body {font-family: Verdana, Tahoma, sans-serif; font-size: 12px;} .vtop {vertical-align: top;} table th:nth-child(1) {width: 20%;}";
    html  = "table th:nth-child(2) {width: 30%;} table th:nth-child(3) {width: 50%;}";
    html  = "</style>";
    html  = "</head>";
    html  = "<body>";
    html  = "<table border='0' id='tableresult'>";
    html  = "</table>";
    html  = "</body></html>";

    webbrowse.DocumentText = html;
}
 

Затем в Click обработчике событий кнопки я хочу создать новый tr и два td элемента:

 var doc = webbrowse.Document;
var elem = doc.GetElementById("tableresult");
var email = elem.DomElement;
var tr = webbrowse.Document.CreateElement("tr");
var td1 = webbrowse.Document.CreateElement("td");
var td2 = webbrowse.Document.CreateElement("td");
tr.AppendChild(td1);
tr.AppendChild(td2);
elem.AppendChild(tr);
 

Но когда я проверяю источник в элементе WeBrowser управления, я не вижу нового TR или TDs.

Как я могу это решить?

Комментарии:

1. После вызова вы должны перейти Write() к новому объекту Document WebBrowser.Navigate(""); . Затем сделайте так, чтобы ваш addfirst() метод возвращал строку html. например, var browser = new WebBrowser(); browser.Navigate(""); var doc = browser.Document.OpenNew(true); doc.Write(addfirst()); var elem = doc.GetElementById("tableresult"); var tr = doc.CreateElement("tr"); [...] . После этого проверьте новое содержимое: Console.WriteLine(browser.Document.Body.InnerHtml);

2. Я никуда не перемещаюсь, просто хотел создать свою собственную HTML-страницу для отображения в элементе управления веб-браузером.

3. Если вы не вызываете [WebBrowser].Navigate("") и [WebBrowser].Document.OpenNew() , внутренний документ не создается. Вы пробовали то, что я опубликовал?

Ответ №1:

Это немного сложно, но вы почти у цели.

Вам нужно найти tbody элемент table и добавить к нему строку, независимо от того, создали вы tbody явно или нет.

Совет по отладке: когда вы щелкаете правой кнопкой мыши на WebBrowser элементе управления и выбираете View Source , отображается начальный DocumentText , а не измененный. Если вы хотите увидеть обновленный текст документа, посмотрите webBrowser1.Document.Body.InnerHtml .

Примечание: Согласно документации, настройки DocumentText должно быть достаточно; когда вы устанавливаете DocumentText , он переходит к about:blank , а затем загружает содержимое документа на основе текста, который вы установили. Таким образом, происходят все ожидаемые вещи, такие как создание объекта Document или создание навигации, навигации или DocumentComplete событий. То же самое видно и в исходном коде.

Пример

 private void Form1_Load(object sender, EventArgs e)
{
    var html = @"
    <!DOCTYPE html>
    <html>
        <head><title>NewPage</title></head>
        <body>
            <table id=""tableresult"">
                <thead>
                    <th>Column 1</th>
                    <th>Column 2</th>
                </thead>
            </table>
        </body>
    </html>";
    webBrowser1.DocumentText = html;
}

private void button1_Click(object sender, EventArgs e)
{
    var tr = webBrowser1.Document.CreateElement("tr");
    var td1 = webBrowser1.Document.CreateElement("td");
    td1.InnerHtml = "value 1";
    var td2 = webBrowser1.Document.CreateElement("td");
    td2.InnerHtml = "value 2";
    tr.AppendChild(td1);
    tr.AppendChild(td2);
    webBrowser1.Document.GetElementById("tableresult")
               .GetElementsByTagName("tbody")[0].AppendChild(tr);
}
 

Комментарии:

1. Если вы посмотрите ` в обработчике Load событий, вы увидите, что оно по-прежнему равно null, это потому, что оно будет установлено после завершения обработки текущего сообщения. Чтобы отобразить ее значение в окне сообщения в Load событии, после установки DocumentText вы можете увидеть обновленное содержимое следующим образом: BeginInvoke(new Action(() => { MessageBox.Show(webBrowser1.Document.Body.InnerHtml); })); .

2. У меня не было tbody , поэтому я решил, что это не нужно. Спасибо за предупреждение. У меня нет thead so, могу ли я просто исключить это из исходной строки?

3. Как уже упоминалось в ответе, вам не нужно добавлять a tbody внутри таблицы. она будет там, независимо от того, добавляете вы ее явно или нет. Таким образом, пример кода будет работать в обоих случаях, имея или не имея tbody. thead также не обязательно, он будет работать и без thead этого.

4. @Si8 Дайте мне знать, если сообщение ответит на ваш вопрос.