weixin_45314429 2023-01-11 20:14 采纳率: 66.7%
浏览 12
已结题

datagridview动态删除行报错,未将对象引用设置添加到对象的实例。

datagridview 动态删除行报错,未将对象引用设置添加到对象的实例。
未绑定数据库,只动态添加删除,有数据时删除行报错。

 public void DelRow(TelnetSession session)
        {
            try
            {
                
                for (int i = dataGridView1.Rows.Count - 1; i >= 0; i--)
                {
                    DataGridViewRow row = dataGridView1.Rows[i];
                    if (dataGridView1.Rows[i].Cells[7].Value == session.SessionID)
                    {
                        string station = dataGridView1.Rows[i].Cells[0].Value.ToString();
                        this.ShowMsg("设备" + station + "已下线");
                        if(dataGridView1.CurrentRow.Cells[0].Value!=null)
                            dataGridView1.Rows.RemoveAt(i);  //删除一行
                        return;
                    }
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog("DelRow函数调用异常", e);
            }
        }

报错:

img

试过的解决方法
①if(!row.IsNewRow)
②if(dataGridView1.Rows.Count>0)
③if(dataGridView1.CurrentRow.Cells[0].Value!=null)

  • 写回答

1条回答 默认 最新

  • 快撑死的鱼 2023-01-12 01:06
    关注

    回答不易,求求您采纳点赞哦

    您提供的代码存在的问题是,您在当前循环访问 Rows 集合时试图从 DataGridView 中删除一行。这是因为,当您从 DataGridView 中删除一行时,它会影响 Rows 集合的枚举,并导致抛出 InvalidOperationException。

    此问题的一种解决方案是创建需要删除的行的单独列表,然后在迭代后从 DataGridView 中删除这些行。这是一个如何做到这一点的例子:

    List<DataGridViewRow> rowsToDelete = new List<DataGridViewRow>();
    for (int i = dataGridView1.Rows.Count - 1; i >= 0; i--)
    {
        DataGridViewRow row = dataGridView1.Rows[i];
        if (dataGridView1.Rows[i].Cells[7].Value == session.SessionID)
        {
            string station = dataGridView1.Rows[i].Cells[0].Value.ToString();
            this.ShowMsg("设备" + station + "已下线");
            if(dataGridView1.CurrentRow.Cells[0].Value!=null)
                rowsToDelete.Add(row);
            return;
        }
    }
    foreach (DataGridViewRow row in rowsToDelete)
    {
        dataGridView1.Rows.Remove(row);
    }
    

    此外,我注意到您正在检查 DataGridView 的 currentRow 上的空值,这可能不是您想要的,因为您正在遍历网格上的所有行。相反,您应该检查要从中获取值的单元格上的空值,如下所示:

    if(dataGridView1.Rows[i].Cells[0].Value != null) 
    

    这只是可能解决此问题的一种方法,根据项目的具体要求,可能还有其他方法可以达到相同的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 创建了问题 1月11日

悬赏问题

  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题