无数据源DataGridView转XML字符串时触发NullReferenceException问题排查
解决DataGridView转XML时的NullReferenceException问题
嘿,我一眼就看到问题出在哪了!你代码里的DT.DataSet.GetXml()这一行是触发异常的关键——一个新创建的DataTable默认不属于任何DataSet,所以DT.DataSet的值是null,调用它的GetXml()方法自然就会抛出NullReferenceException了。
除此之外,你的代码还有一个容易踩的坑:遍历DGV.Rows时,会包含DataGridView最后那一行空白的“新行”(就是用来添加新数据的那行),如果把这行也加到DataTable里,会生成多余的空数据行。
修正后的完整代码
public string DataGridViewToXML(DataGridView DGV) { DataTable DT = new DataTable(); // 构建DataTable列结构,匹配原列类型更严谨 foreach (DataGridViewColumn col in DGV.Columns) { DT.Columns.Add(col.Name, col.ValueType ?? typeof(string)); } // 遍历DataGridView的行,跳过空白新行 foreach (DataGridViewRow row in DGV.Rows) { if (row.IsNewRow) continue; // 跳过未编辑的空白新行 DataRow dRow = DT.NewRow(); foreach (DataGridViewCell cell in row.Cells) { // 处理单元格值为null的情况,符合DataTable空值规范 dRow[cell.ColumnIndex] = cell.Value ?? DBNull.Value; } DT.Rows.Add(dRow); } // 创建临时DataSet并加入DataTable,再生成XML using (DataSet ds = new DataSet()) { ds.Tables.Add(DT); return ds.GetXml(); } }
关键修正点说明
- 解决DataSet空引用:手动创建临时DataSet,将DataTable添加进去后再调用
GetXml(),避免直接访问空的DT.DataSet。 - 跳过空白新行:通过
row.IsNewRow判断过滤掉未编辑的空白行,避免生成无效数据。 - 优化类型与空值处理:
- 给DataTable列指定和DataGridView列一致的类型,避免类型不匹配问题;
- 单元格值为null时用
DBNull.Value替代,符合DataTable的空值存储规范。
这样修改后,你的代码应该就能正常生成XML字符串,不会再触发NullReferenceException了。
内容的提问来源于stack exchange,提问作者Sander
相关产品推荐
相关产品推荐

