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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:49