访问DataGridView的Rows报了OutOfIndexRangeException错误

DataGridView绑定了一个List<Entity>实体集合,在遍历DataGridView的每一行DataBoundItem时候,如果符合某个条件的话,则移除List<Entity>中的一个实体,这个过程忽略了一个很严重的问题,IEnumerable类型不能在被遍历的时候修改它的成员,否则将出现原本存在/不存在的成员无法访问/没被访问,我的话就是出现了无法访问的情况,因为原有的一个对象被我移除了,而它的Iterator还存在,结果系统访问了一个超出集合长度的对象,报了OutOfRangeException,代码如下:

List<EntityRequest> requestList = this.selectedList as List<EntityRequest>;
            EntityRequest tempRqs;
            foreach (DataGridViewRow row in base.MainDgv.Rows)
            {
                tempRqs = row.DataBoundItem as EntityRequest;
                if ((row.Cells["CheckColumn"].EditedFormattedValue == null
                    || (bool)row.Cells["CheckColumn"].EditedFormattedValue == false)
                    && requestList.Contains(tempRqs))
                {
                    requestList .Add(tempRqs);
                }
            }
            return requestList;

经过改正,应该这样修改:

List<EntityRequest> requestList = this.selectedList as List<EntityRequest>;
            List<EntityRequest> tempRqsList = new List<EntityRequest>();
            EntityRequest tempRqs;
            foreach (DataGridViewRow row in base.MainDgv.Rows)
            {
                tempRqs = row.DataBoundItem as EntityRequest;
                if ((row.Cells["CheckColumn"].EditedFormattedValue == null
                    || (bool)row.Cells["CheckColumn"].EditedFormattedValue == false)
                    && requestList.Contains(tempRqs))
                {
                    tempRqsList.Add(tempRqs);
                }
            }
            foreach (EntityRequest item in tempRqsList)//遍历完dgv之前不能修改它的数据源,必须在遍历之后修改,否则容易报错
            {
                requestList.Remove(item);
            }
            return requestList;

经常犯这种低级错误,应该多注意注意了,警告自己

转载于:https://www.cnblogs.com/cellphoneyeah/p/6438451.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值