Form.Show(): 无法访问已释放对象

5
我已经卡在这里有一段时间了。我无法在按钮单击时打开一个新的表格。 如果我在初始表格构造函数中创建并 .Show() 表格,它会起作用。我不明白! :-(
启动表单
public Form1()
    {
        InitializeComponent();
        startmessage();
        br = Logic.loadXML("theshiiiiiittt.xml");
        br2 = br.Clone();
        loadboxes();
        //serializeTest();
        t = new Thread(contactDBUpdate);
        //t.IsBackground = true;
        t.Start();

    }

按钮事件:

private void resultButton_Click(object sender, EventArgs e)
    {
        ResultForm rf = new ResultForm(this);
        rf.Show();
        this.Enabled = false;
    }

希望这已经足够了。

点击事件是否正确触发?你尝试在事件中加入类似MessageBox.Show("Test")的代码吗? - Gimly
1
你能贴出堆栈跟踪吗? - Dennis
我已经尝试使用MessageBox并且它可以正常触发。按钮不是问题的原因 :( - Bjornen
4个回答

5

在我的情况下,这是因为我想要使我的表单非模态。因此,我将它们从form.ShowDialog(parentForm)更改为form.Show()

但如果我尝试第二次显示窗体,则会导致ObjectDisposedException,因为代码中的某个位置有this.Close();Form.Close也会把它释放。

MSDN:

当一个窗体关闭时,所有在该对象内创建的资源都会被关闭,而该窗体则被释放

我只需要更改

this.Close();

to

this.Hide();

1
在多次显示和隐藏的情况下,它不会消耗更多的内存吗? - iJade
为什么?隐藏只是使其不可见,而显示则可见。 - Tim Schmelter
在VB.NET中,为什么所有的正确性都在My.Forms中的Form中呢? - Kiquenet

2

我找到了代码问题。我再看了一遍堆栈跟踪,发现了一个名为“Icon”的消息。

           this.Icon.Dispose();

Startupform有这行代码。

这段代码解决了我的问题:

private void resultButton_Click(object sender, EventArgs e)
{

    ResultForm rf = new ResultForm(this);
    rf.Icon = this.Icon;
    rf.Show();
    this.Enabled = false;
}

感谢你的帮助之手……

1
问题在于您的表单对象失去了作用域并被释放。 如果您想保持对话框打开,请使用Form.ShowDialog(); 尝试这个:
    private void resultButton_Click(object sender, EventArgs e)
    {
        using(ResultForm rf = new ResultForm(this))
        { 
          rf.ShowDialog();
        }
        this.Enabled = false;
    }

2
每次操作 OP 都会创建一个新的 ResultForm 实例,这不可能是异常的原因。 - Dennis

0
在实现Windows窗体上的单例模式时,我也遇到了这个错误。
解决方案是在静态引用中分配一个空值。
protected override void Dispose(bool disposing)

通过放置简单的代码行。

obj=null;  //obj is the static reference in the class.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接