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

Cannot access a disposed object - New solution

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

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

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

出现此消息的原因可能是什么?以及如何解决?据我所知,一旦在新打开的表单上点击 X,C# 应该处理该表单,以允许它重新打开?

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

Exception Thrown: 'System.ObjectDispostedException' in System.Windows.Forms.dll ("Cannot Access a disposed 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();
        }
    }

}