将DataGridView行值加载到ComboBox时出现Out Of Range Exception错误
报错原因与修复方案
报错本质
你遇到的System.ArgumentOutOfRangeException是典型的索引越界错误,触发原因是代码访问了不存在的集合下标:下标小于0,或者大于等于集合总长度。在你当前的开发场景下,常见的触发诱因有三个:
- 你选中的是DataGridView的空白新增行(如果开启了允许用户添加行的属性),该行没有绑定实际数据,访问单元格时会触发越界
- 访问DataGridView单元格时用的列索引超过了实际加载的列总数,比如你从Excel加载了3列,列下标只能是0/1/2,写
Cells[3]就会越界 - 删除If判断后直接访问
SelectedRows[0],此时如果没有选中的有效行,集合为空,访问下标0直接触发越界,所以报错落在首个Items.Add行的前一行取值逻辑上
修复步骤
1. 补全行有效性判断
不要删除原有选中行判断的If语句,反而要补全判断逻辑,排除空白行和无选中行的情况:
// 先确认有选中行,且选中行不是空白新增行 if (dataGridView1.SelectedRows.Count > 0 && dataGridView1.SelectedRows[0].Index != dataGridView1.NewRowIndex) { // 后续加载到ComboBox的逻辑写在这里 }
2. 修正单元格取值逻辑
优先用列名访问单元格,避免数字索引写错导致越界,如果必须用数字索引,先确认索引值小于总列数:
// 列名写法,更稳妥 var cellValue = dataGridView1.SelectedRows[0].Cells["你的Excel列名"].Value?.ToString(); // 数字索引写法,先判断索引是否合法 int targetColIndex = 2; if (targetColIndex < dataGridView1.ColumnCount) { var cellValue = dataGridView1.SelectedRows[0].Cells[targetColIndex].Value?.ToString(); }
3. 修正ComboBox加项逻辑
加项前先清空原有内容,空值判断后再添加,避免空值或者索引越界:
comboBox1.Items.Clear(); // 示例:把选中行的所有非空单元格值加载到ComboBox foreach (DataGridViewCell cell in dataGridView1.SelectedRows[0].Cells) { if (cell.Value != null) { comboBox1.Items.Add(cell.Value.ToString()); } }
注意:如果你的需求是把选中行的某几列固定值加到ComboBox,不要在加项过程中用下标访问还没添加的ComboBox元素,所有取值优先从DataGridView的选中行获取,不要从ComboBox的Items集合获取。
内容的提问来源于stack exchange,提问作者DieserTBZ
相关产品推荐
相关产品推荐

