我有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)
任何想法????
答案 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 ()