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

读取自定义输入的DataGridView时出现System.NullReferenceException错误求助

DataGridView读取输入值时System.NullReferenceException异常排查与解决方案

问题现象

读取自行输入值的DataGridView时触发System.NullReferenceException异常,提示“未将对象引用设置到对象的实例”,报错代码片段如下:

string[,] Datavalue = new string[GridDelivery.Rows.Count - 1, GridDelivery.Columns.Count];

foreach (DataGridViewRow row in GridDelivery.Rows)
{
    foreach (DataGridViewColumn Col in GridDelivery.Columns)
    {
       // 异常触发行
       Datavalue[row.Index, Col.Index] = GridDelivery.Rows[row.Index].Cells[Col.Index].Value.ToString();
    }
}

已通过GridDelivery.Rows.Count-1尝试规避最后一行空值问题,但异常仍未解决。

异常原因分析

  • 单元格Value为空:用户未输入内容的单元格,Value属性为null,直接调用ToString()会触发空引用异常。
  • 遍历范围不匹配:foreach遍历所有行时会包含最后一行空行,而数组行长度是Rows.Count-1,当row.Index等于Rows.Count-1时,会超出数组索引范围,同时该行单元格本身无有效值。
  • 无效行/列干扰:部分行可能被标记为删除或未初始化,导致行/单元格对象为空。

修复后代码示例

针对上述问题,修改代码如下:

int validRowCount = GridDelivery.Rows.Count - 1;
int colCount = GridDelivery.Columns.Count;
string[,] Datavalue = new string[validRowCount, colCount];

// 仅遍历有效数据行,跳过最后一行空行
for (int i = 0; i < validRowCount; i++)
{
    DataGridViewRow currentRow = GridDelivery.Rows[i];
    // 跳过空行或已标记删除的行
    if (currentRow.IsNewRow || currentRow.Cells.All(cell => cell.Value == null))
        continue;

    for (int j = 0; j < colCount; j++)
    {
        DataGridViewCell currentCell = currentRow.Cells[j];
        // 安全处理空值,转为空字符串
        Datavalue[i, j] = currentCell.Value?.ToString() ?? string.Empty;
    }
}

关键优化点:

  • 用for循环精确控制遍历范围,避免触及最后一行空行
  • 用?.ToString() ?? string.Empty语法安全处理单元格空值
  • 增加空行判断,过滤无效数据行

输入控件替代方案

DataGridView作为输入控件本身可行,但需要额外处理空值、行有效性等细节。如果需要更简易的输入方案,推荐:

  • 多行TextBox:适合纯文本批量输入,可按行拆分数据,无需复杂配置
  • ListView:支持表格样式输入,配置比DataGridView轻量化,适合中小体量数据输入
  • 动态行输入面板:自定义用户控件,每行包含对应输入框,支持动态添加/删除行,逻辑更直观

补充截图

GUI界面截图:
GUI界面截图

调试错误截图:
调试错误截图

内容的提问来源于stack exchange,提问作者Thunderwolf4012

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:56:07