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