C#获取DataGridView数据提示索引超出范围如何解决
异常根因
.NET 中所有从0开始计数的有序集合,合法索引范围固定为 0 到 集合长度 - 1。RowCount 属性返回的是 DataGridView 的总行数,直接将这个值作为行索引访问,本质是在访问超出集合范围的不存在的行,必然触发索引越界异常。
另外有一个容易忽略的细节:DataGridView 默认开启 AllowUserToAddRows 属性,此时 RowCount 统计值会包含底部供用户录入新数据的空白行,这一行不存储实际业务数据,直接取倒数第一行大概率会拿到空值。
正确实现
先根据控件配置计算真实数据行的最后一行索引,同时增加空值判断,避免空引用异常:
// 计算最后一条数据行的索引 int lastRowIndex = dgvWellsFargo.AllowUserToAddRows ? dgvWellsFargo.RowCount - 2 : dgvWellsFargo.RowCount - 1; // 处理无数据的边界场景 if (lastRowIndex >= 0) { DataGridViewRow targetRow = dgvWellsFargo.Rows[lastRowIndex]; // 取值前做空值校验,避免null调用ToString()抛异常 txtNoOfTransactions.Text = targetRow.Cells[1].Value?.ToString() ?? string.Empty; // 金额格式化前先做类型校验,避免格式转换失败 if (decimal.TryParse(targetRow.Cells[2].Value?.ToString(), out decimal totalAmount)) { txtTotal.Text = string.Format("{0:c2}", totalAmount); } }
补充说明
- DataGridView 的单元格索引同样从0开始计数,如果你的目标数据在第1、2列,需要把代码里的
Cells[1]、Cells[2]调整为Cells[0]、Cells[1],避免取错列。 - 如果 DataGridView 是绑定数据源模式,更推荐直接从绑定的数据源集合中取最后一条数据,不需要通过UI控件的行集合访问,能避开很多UI层的索引、状态相关问题。
内容的提问来源于stack exchange,提问作者Donald
相关产品推荐
相关产品推荐

