DataGridView触发CellClick时抛出IndexOutOfRangeException问题求助
解决DataGridView更新数据源后CellClick触发IndexOutOfRangeException的问题
我来帮你搞定这个问题——从你提供的堆栈跟踪和代码来看,这个索引越界异常是因为更新数据源后,DataGridView的选中状态和新数据源没同步导致的。
问题根源
当你执行dataGridView2.DataSource = null; dataGridView2.DataSource = _securititesToAdd;重置数据源时,控件可能还保留着之前的选中行/单元格索引。新数据源的行数可能和旧的不一样,或者索引已经失效,这时候点击单元格,CurrencyManager尝试访问旧索引对应的项,就会抛出IndexOutOfRangeException。
可行的解决方案
1. 重置数据源前先清空选中状态
在更新数据源之前,手动清除选中行和当前单元格,让控件状态和即将绑定的新数据源对齐:
// 先清除选中状态和当前单元格 dataGridView2.ClearSelection(); dataGridView2.CurrentCell = null; // 再更新数据源 dataGridView2.DataSource = null; dataGridView2.DataSource = _securititesToAdd;
2. 绑定数据源后同步控件状态
如果第一种方法还没解决,绑定新数据源后强制刷新控件,并确保当前单元格在有效范围内:
dataGridView2.DataSource = null; dataGridView2.DataSource = _securititesToAdd; // 强制刷新控件 dataGridView2.Refresh(); // 根据新数据源的行数设置当前单元格 if (dataGridView2.Rows.Count > 0) { dataGridView2.CurrentCell = dataGridView2.Rows[0].Cells[0]; } else { dataGridView2.CurrentCell = null; }
3. 在CellClick事件里加索引校验
在处理CellClick事件的时候,先判断行索引是否有效,从源头避免异常:
private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e) { // 跳过标题行和无效索引的情况 if (e.RowIndex < 0 || e.RowIndex >= dataGridView2.Rows.Count) { return; } // 这里写你的业务逻辑代码 }
额外小建议
另外,没必要每次都设置DataSource = null,直接绑定新的_securititesToAdd就行,除非你需要彻底清除旧数据绑定。如果_securititesToAdd是普通的List<T>,换成BindingList<T>作为数据源会更好,它能自动通知DataGridView数据变化,减少这类状态不同步的问题。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

