You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无数据源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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:59