无法访问已处置的对象-新解决方案

本文关键字:对象 解决方案 访问 | 更新日期: 2023-09-27 18:18:06

我在重新打开先前关闭的表单时遇到错误。我的代码如下:

    private void opentfk_Click(object sender, EventArgs e)
    {
        tfkform.Show();
    }

上面的代码将打开按预期工作的表单,我目前遇到的问题是,如果我决定要关闭新打开的表单(原始表单应该在后台保持打开),那么,忘记对该表单进行更改。按下按钮重新打开实际表单。我遇到了一个stackoverflow异常,导致我的应用程序崩溃。

这个消息的原因是什么?如何解决?据我所知,一旦在新打开的表单上点击X, c#应该处理表单,允许它重新打开?

请注意,这是一个新创建的解决方案,唯一主要的变化是按钮的处理程序

异常抛出:'System. 'ObjectDispostedException"System.Windows.Forms.dll ("Cannot Access a dispose Object.")

无法访问已处置的对象-新解决方案

在单击第二个表单上的X之后,假设您没有取消关闭事件,那么该表单将被处理。你不能第二次展示。

选项一是每次创建一个新实例,而不是尝试重用实例。

private void opentfk_Click(object sender, EventArgs e)
{
    var tfkform = new TfkForm();
    tfkform.Show();
    // or  using (var tfkform = new TfkForm())
    //         tfkform.ShowDialog();
}

选项二是订阅第二个表单的FormClosing事件。您可以取消关闭事件,而只隐藏表单。然后,您可以再次显示表单,并且不会得到异常。

private void TfkForm_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
    Hide();
}

选项三是检查您的表单引用是否为空或已被处置。下面是一个使用Form1和Form2的例子:

public partial class Form1 : Form
{
    Form2 f2 = new Form2();
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 == null || f2.IsDisposed)
        {
            f2 = new Form2();
            f2.Show();
        }
        else 
        {
            if (f2.WindowState == FormWindowState.Minimized)
            {
                f2.WindowState = FormWindowState.Normal;
            }
            f2.Show();
            f2.BringToFront();
        }
    }
}