读取自定义输入的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界面截图:
调试错误截图:
内容的提问来源于stack exchange,提问作者Thunderwolf4012
相关产品推荐
相关产品推荐

