1

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

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

我遇到的问题是,为了显示这个表单,我使用了一个调用 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();
        }
4

2 回答 2

3

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

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

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

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

1)安排它,以便表单实际上不会关闭,而是被隐藏,并且如果主表单需要再次显示它可以再次可见(请注意,如果表单正在做任何类型的工作,隐藏它赢了'不一定会停止这项工作,在您的情况下可能需要也可能不需要)。

2)每次要显示时创建一个新的表单实例(但是在表单的前一个化身上显示的任何内容在关闭时都会丢失)。

于 2013-08-13T02:46:09.333 回答
2

你可能想要这样的东西:

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

您需要订阅该事件......当您想要允许表单关闭时不要忘记取消订阅。

于 2013-08-13T03:25:04.730 回答