表格Dispose()或Close()

时间:2010-01-19 11:31:59

标签: winforms

我有2个表格。从我创建的一个表单中显示另一个表单。它工作得很好。但是当我尝试从创建它的表单中关闭或处理该表单时,我得到以下异常:

Exception :
   Value Dispose() cannot be called while doing CreateHandle().

Stack Trace :
========================
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.Label.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.Windows.Forms.Form.Dispose(Boolean disposing)
   at Speedometer_Application.frmSpeedometer.Dispose(Boolean disposing) 

任何想法????

4 个答案:

答案 0 :(得分:16)

当我们尝试在构造函数或Load事件中关闭表单时,通常会发生错误Value Close() cannot be called while doing CreateHandle()

例如,以下代码给出错误:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.Close;
}

解决方案:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.BeginInvoke(new MethodInvoker(Close));
} 

您可以在代码中使用它。

答案 1 :(得分:1)

很难说你发布的代码有什么问题。

您发布的代码应该可以使用(使用Show()显示的表单应该可以使用Dispose()方法关闭)。

它不起作用的原因可能是您试图处理的形式。当您在对象上调用Dispose()方法(根据错误消息,这就是发生的事情)时,该对象将尝试处理其所有子节点并进行一些清理。这是寻找错误的地方。

我的建议是以objfrm(或制作新的EMPTY表单)的形式注释掉所有代码并查看是否发生错误。它不应该发生。然后开始添加注释代码并查看错误发生的时间。我敢打赌,它将在Dispose方法的结果中被调用。

答案 2 :(得分:0)

代码如下:

if (frmMain.objfrm== null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.Show();
frmMain.objfrm.BringToFront();

frmMain是具有frmMyForm的静态变量的Main Form。在我想要使用它的代码中,我只是检查它是否为空,而不是使用静态实例创建它,而不是给出peoperty。

关闭表单时,我有以下代码:

frmMain.objfrm.Close_this();

Close_this调用Close()或Dispose()方法。

但是当我调用该函数时,我得到了上述异常。

答案 3 :(得分:0)

您需要使用 ShowDialog 而不是显示来解决问题。显示不阻止应用程序,代码继续运行。

您正在创建GUI时处理对象(异常所说的)

试试这个:

if (frmMain.objfrm== null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.ShowDialog();

请注意 ShowDialog ()