点击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
相关产品推荐
相关产品推荐

