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;
经常犯这种低级错误,应该多注意注意了,警告自己
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步