Form.Show():无法访问已处置的对象

时间:2014-01-10 10:44:46

标签: c# winforms

我已经坚持了一段时间了。我无法在按钮点击上打开新表单。 如果我在开始表单构造函数中创建和.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;
    }

希望这已经足够了。

4 个答案:

答案 0 :(得分:5)

在我的情况下,这是因为我想让我的表格非模态。所以我将它们从form.ShowDialog(parentForm)更改为form.Show()

但如果我尝试第二次显示表单,则会导致ObjectDisposedException,因为代码中的某处是this.Close();Form.Close也处理它。

MSDN:

  

当表单关闭时,在对象中创建的所有资源都是   关闭并表格处理

我只需要改变

this.Close();

this.Hide();

答案 1 :(得分:1)

发现我的代码问题。 我再看了一下堆栈跟踪,发现了一条消息“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;
}

感谢您的帮助......

答案 2 :(得分:0)

问题是您的表单对象会松开作用域并被废弃。 如果要保持对话框打开,请使用Form.ShowDialog();

试试这个:

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

答案 3 :(得分:0)

Wile在Windows窗体上实现单例模式我也遇到了这个错误。 解决方案是您必须为

中的静态引用分配空值
protected override void Dispose(bool disposing)

通过简单的线条。

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