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

点击Form2按钮删除DataGridView行失败:系统找不到对象

问题根源与修复方案

你遇到的「找不到对象」错误,核心原因很直白:你在Form2里新建了一个完全独立的restaurantSale窗体实例,而不是操作原来显示数据的那个Form1窗口!这个新实例的receiptGrid是空的,根本没有你之前选中的行,系统当然找不到要删除的对象。

下面是具体的修复步骤:

1. 让Form2接收原Form1的实例

首先修改Form2的构造函数,添加一个参数来接收打开它的Form1实例,把这个实例保存为成员变量,方便后续操作:

// 在supervisorVoidPass类里添加成员变量和修改构造函数
private restaurantSale _originalMainForm;

public supervisorVoidPass(restaurantSale originalForm)
{
    InitializeComponent();
    // 保存原Form1的实例
    _originalMainForm = originalForm;
}

2. 在Form1里打开Form2时传递自身实例

当你在Form1里要打开Form2的时候,把当前的Form1实例传过去,而不是直接new一个无参的Form2:

// 比如在Form1的某个按钮点击事件里打开Form2
private void OpenVoidPassForm_Click(object sender, EventArgs e)
{
    supervisorVoidPass voidForm = new supervisorVoidPass(this);
    voidForm.ShowDialog();
}

3. 修改Form2的删除逻辑,操作原窗体的DataGridView

把你原来的button8_Click代码改成下面这样,注意两点:

  • 用保存的原Form1实例_originalMainForm来操作receiptGrid
  • 反向遍历选中行(避免删除行后索引错乱,导致跳过某些行)
private void button8_Click(object sender, EventArgs e)
{
    string inpPass = "1234";
    if (voidPass.Text == inpPass)
    {
        MessageBox.Show("Void Success");
        
        // 反向遍历选中行,防止索引变化导致漏删
        for (int i = _originalMainForm.receiptGrid.SelectedRows.Count - 1; i >= 0; i--)
        {
            DataGridViewRow selectedRow = _originalMainForm.receiptGrid.SelectedRows[i];
            _originalMainForm.receiptGrid.Rows.RemoveAt(selectedRow.Index);
        }
        
        MessageBox.Show("Void Records");
        // 这里不需要再调用ShowDialog(),原Form1本来就是打开状态的
    }
}

这样修改后,你操作的就是原来显示数据的那个DataGridView了,自然能正确找到选中的行并删除。

内容的提问来源于stack exchange,提问作者Sir George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:01:13