#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()
к новому объекту DocumentWebBrowser.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 Дайте мне знать, если сообщение ответит на ваш вопрос.