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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:06:27