DataGridView删除记录触发System.ArgumentNullException异常,寻求解决方案
解决DataGridView删除记录时的ArgumentNullException问题
让我来帮你捋清楚这个问题——你遇到的System.ArgumentNullException本质是因为查询后model变成了null,后续调用db.Entry(model)时自然触发了空引用异常。咱们一步步来修复:
1. 先解决ID值获取的核心问题
你提到断点看到dgvBrand.CurrentRow.Cells["ID"].Value转成int后是0,这就是问题的源头:数据库里的品牌ID应该是自增主键,不会存在ID为0的记录,所以db.brands.Where(x => x.ID == 0).FirstOrDefault()必然返回null。
你可以这么排查和修复:
- 先确认DataGridView中ID列的列名是否真的是
"ID"(C#区分大小写,别写错了),或者试试用列索引获取值,比如Cells[0].Value; - 增加值的有效性判断,避免把
DBNull.Value或null转成0:var idCellValue = dgvBrand.CurrentRow.Cells["ID"].Value; if (idCellValue == null || idCellValue == DBNull.Value) { MessageBox.Show("无法获取选中记录的ID,请检查数据"); return; } model.ID = Convert.ToInt32(idCellValue);
2. 增加查询结果的null判断
就算ID值正确,也有可能数据库里的记录已经被其他操作删除了,所以必须先判断查询后的model是否为null:
model = db.brands.Where(x => x.ID == model.ID).FirstOrDefault(); if (model == null) { MessageBox.Show("该记录已不存在,无法执行删除操作"); return; } // 后续的Attach、Remove操作
3. 简化EF删除逻辑(可选优化)
其实Entity Framework删除记录可以更简洁,用主键查询的Find方法比Where+FirstOrDefault更高效,也不需要手动处理Attach:
using (SOMSEntity db = new SOMSEntity()) { var brandToDelete = db.brands.Find(model.ID); if (brandToDelete == null) { MessageBox.Show("该记录已不存在"); return; } db.brands.Remove(brandToDelete); db.SaveChanges(); DisplayDGV(); MessageBox.Show("Deleted Successfully"); }
总结一下:核心问题是获取的ID无效导致查询不到记录,model变为null触发异常。先确保ID值获取正确,再加上null判断,就能彻底解决这个问题了。
内容的提问来源于stack exchange,提问作者jhenryj09
相关产品推荐
相关产品推荐

