无法访问已处置的对象-新解决方案
本文关键字:对象 解决方案 访问 | 更新日期: 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();
}
}
}