使用DocumentNode导入网页表格至DataGridView,文本显示异常求助
问题根源与修正方案
核心问题分析
初始代码绑定
List<string>的问题:
DataGridView绑定List<string>时,默认会显示集合元素的公共属性,而string的公共属性只有Length,所以你看到的数字其实是每个字符串的长度,而非文本内容。第二个版本的错误:
你错误地将DataTable列类型设为int,还强制把表格文本转成整数,这完全偏离了显示文本的需求,而且如果表格文本包含非数字内容,还会抛出格式异常。
修正后的代码
DataTable dt1 = new DataTable(); // 定位目标表格节点 var tableNode = doc.DocumentNode.SelectSingleNode("//div[@id=\"cr_cashflow\"]/div[2]/div/table"); if (tableNode != null) { // 自动创建表格列:优先用表头,无表头则按第一行单元格数量创建 var headerRow = tableNode.SelectSingleNode("thead/tr") ?? tableNode.SelectSingleNode("tbody/tr[1]"); if (headerRow != null) { foreach (var headerCell in headerRow.Elements("th")) { dt1.Columns.Add(headerCell.InnerText.Trim(), typeof(string)); } } else { var firstDataRow = tableNode.SelectSingleNode("tbody/tr"); if (firstDataRow != null) { int columnCount = firstDataRow.Elements("td").Count(); for (int i = 0; i < columnCount; i++) { dt1.Columns.Add($"列{i+1}", typeof(string)); } } } // 遍历所有数据行,填充DataTable var dataRows = tableNode.SelectNodes("tbody/tr").Where(tr => tr.Elements("td").Count() > 0); foreach (var rowNode in dataRows) { DataRow newRow = dt1.NewRow(); int cellIndex = 0; foreach (var cellNode in rowNode.Elements("td")) { if (cellIndex < dt1.Columns.Count) { newRow[cellIndex] = cellNode.InnerText.Trim(); cellIndex++; } } dt1.Rows.Add(newRow); } } // 绑定到DataGridView dataGridView1.DataSource = dt1;
关键修正点
- 放弃直接绑定
List<string>:改用DataTable来承载表格结构,确保每个单元格内容对应DataTable的一列一行。 - 列类型设为
string:完全匹配你要显示文本的需求,避免不必要的类型转换。 - 拆分单元格数据:不再直接取
<tr>的InnerText(这会把一行所有单元格文本拼接成一个字符串),而是遍历每个<td>,将文本分别填入DataTable的对应单元格,还原表格的原始结构。
内容的提问来源于stack exchange,提问作者DynamicHelp
相关产品推荐
相关产品推荐

