2015-10-18 79 views
-1

我在重新打开先前关闭的表单时遇到错误。我的代码如下:无法访问已处理的对象 - 新解决方案

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

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

该消息的原因是什么?以及如何解决?据我所知,一旦在新打开的窗体上点击X应该处理表单,以便重新打开它?

请注意,这是一个新创建的解决方案,唯一的主要变化是

抛出的异常的按键处理程序:在 System.Windows.Forms.dll中(“System.ObjectDispostedException”“无法访问处理对象“)

+2

您显示的代码可能不会导致您的问题。您应该为我们提供足够的代码来复制您的问题。 – Enigmativity

+0

@Enigmativity主窗体在主屏幕上目前有6个按钮,为每个按钮添加一个处理程序。 6中的5个调用一个函数来显示一个消息框,其中显示“功能尚未提供”。没有的按钮。是提供的一个..正在打开的窗体是一个新添加的按钮+文本框创建的winform。代码 –

回答

2

单击该第二个窗体上的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(); 
} 
+0

'((Form)sender)没有变化.Hide();' – Loathing

1

选项三是检查您的表单引用是否为空或已处置。以下是使用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(); 
     } 
    } 

} 
相关问题