Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#正在使用Form.show()命令崩溃,ObjectDisposedException-请进行更深入的查看/解释_C# - Fatal编程技术网

C#正在使用Form.show()命令崩溃,ObjectDisposedException-请进行更深入的查看/解释

C#正在使用Form.show()命令崩溃,ObjectDisposedException-请进行更深入的查看/解释,c#,C#,我正在做一个项目,有两个表单——一个是主表单,另一个是类似于控制台的表单,由拆分面板和列表框(在面板1中)组成 我调用了一个方法(writeToConsole(string textToWrite)),顾名思义,它在ConsoleWidow表单的列表框中添加了一行文本 我遇到的问题是,为了显示这个表单,我使用了一个调用show命令的按钮。但是,如果我用右上角的“x”按钮关闭上述表单,然后再次单击“显示控制台”按钮,我会得到以下结果: ObjectDisposedException "Cann

我正在做一个项目,有两个表单——一个是主表单,另一个是类似于控制台的表单,由拆分面板和列表框(在面板1中)组成

我调用了一个方法(writeToConsole(string textToWrite)),顾名思义,它在ConsoleWidow表单的列表框中添加了一行文本

我遇到的问题是,为了显示这个表单,我使用了一个调用show命令的按钮。但是,如果我用右上角的“x”按钮关闭上述表单,然后再次单击“显示控制台”按钮,我会得到以下结果:

ObjectDisposedException

 "Cannot access a disposed object.
Object name: 'consoleOutput'."
现在,我有点理解这个问题——我在一两个月前就遇到了,从我的理解来看,它是因为当你按下x键时,它会关闭表单,这意味着它必须在显示之前重新初始化/重新加载——因此错误是(简而言之)“我不能显示不存在/处于不确定状态的东西”

(同样,这是整个“表面上的意思,但实际上并不比那更深”的观点——我理解它比那更深)

我的问题是:有人能给我解释一下到底发生了什么/错了,以及做这类事情的最佳方式吗

我理解错误的概念,我知道一两种修复错误的方法,但我想成为一名程序员,因此我想知道(至少)这种情况下的事件流,并扩展我的知识

谢谢

为了安全起见:

consoleOutput consoleOutput = new consoleOutput();

        private void btnShowConsole_Click(object sender, EventArgs e)
        {
            //Check to see if the console is visible, of which if its not, make it so
            //If it is on the other hand, just bring it to the front to show the user
            if (consoleOutput.Visible == false)
                consoleOutput.Show();
            else
                consoleOutput.BringToFront();
        }

本机操作系统资源是一种有价值的商品。为了有效地使用这些资源,程序不应该占用这些资源超过必要的时间。在托管代码中,.NET framework提供了接口。可以通过Dispose()方法指示此接口的实现及时释放或处置该实现负责创建(托管或非托管)的任何资源

在WinForms应用程序中,几乎所有可视组件都在某种程度上涉及本机操作系统资源,因此这些组件实现IDisposable。当Dispose()d或Close()d时,它们将释放其本机资源(尽管该组件本身仍然可以通过其引用被程序访问)

IDisposable契约的一个要求是,如果对象已经被释放,则实现不应允许通过公共成员访问该对象。如果试图进行此类访问,则应抛出ObjectDisposedException

在您的具体情况下,您有两个选择:

1) 对其进行排列,使窗体不会实际关闭,而是隐藏,并且在主窗体需要再次显示时可以再次显示(请注意,如果窗体正在执行任何类型的工作,隐藏它不一定会停止该工作,在您的情况下,这可能是您所希望的,也可能不是)


2) 每次您想要显示表单时,都要创建一个新的表单实例(但在表单的前一个版本上显示的任何内容在关闭时都将丢失)。

本机操作系统资源是一种有价值的商品。为了有效地使用这些资源,程序不应该占用这些资源超过必要的时间。在托管代码中,.NET framework提供了接口。可以通过Dispose()方法指示此接口的实现及时释放或处置该实现负责创建(托管或非托管)的任何资源

在WinForms应用程序中,几乎所有可视组件都在某种程度上涉及本机操作系统资源,因此这些组件实现IDisposable。当Dispose()d或Close()d时,它们将释放其本机资源(尽管该组件本身仍然可以通过其引用被程序访问)

IDisposable契约的一个要求是,如果对象已经被释放,则实现不应允许通过公共成员访问该对象。如果试图进行此类访问,则应抛出ObjectDisposedException

在您的具体情况下,您有两个选择:

1) 对其进行排列,使窗体不会实际关闭,而是隐藏,并且在主窗体需要再次显示时可以再次显示(请注意,如果窗体正在执行任何类型的工作,隐藏它不一定会停止该工作,在您的情况下,这可能是您所希望的,也可能不是)


2) 每次您想要显示表单时,都要创建一个新的表单实例(但在表单的前一个版本中显示的任何内容在关闭时都会丢失)。

您可能需要这样的内容:

private void ConsoleOutput_FormClosing(object sender, FormClosingEventArgs e)
{
   this.Hide();
   e.Cancel = true; // cancel the close event.
}

您需要订阅活动。。。当您希望关闭表单时,请不要忘记取消订阅。

您可能希望这样:

private void ConsoleOutput_FormClosing(object sender, FormClosingEventArgs e)
{
   this.Hide();
   e.Cancel = true; // cancel the close event.
}

您需要订阅活动。。。如果希望关闭表单,请不要忘记取消订阅。

您需要显示用于关闭表单的代码,然后再次显示。但是听起来你需要一个新的…@jmoreno我已经添加了代码,但是我不认为需要它,因为它非常基本——正如我在问题中所说的,只是show命令。正如Wayne在回答中指出的,每次创建一个新表单意味着数据丢失,您需要显示用于关闭表单的代码,然后再次显示。但是听起来你需要一个新的…@jmoreno我已经添加了代码,但是我不认为需要它,因为它非常基本——正如我在问题中所说的,只是show命令。正如Wayne在回答中指出的那样,每次创建一个新表单都意味着数据丢失