在 Winform 上调用 Dispose() 或 Close() 时,“在执行 CreateHandle() 时无法调用 Value Dispose()”

问题描述 投票:0回答:4

我有 2 份表格。我从一种形式创建并展示了另一种形式。效果很好。但是,当我尝试从创建该表单的表单上调用 Close() 或 Dispose() 时,出现以下异常:

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) 

有什么想法吗?

winforms
4个回答
22
投票

错误

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

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

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
投票

很难从您发布的代码中说出问题所在。

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

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

我的建议是注释掉 objfrm 表单中的所有代码(或创建新的 EMPTY 表单)并查看是否发生错误。它不应该发生。然后开始添加注释代码并查看错误何时发生。我打赌它将出现在因 Dispose 方法而被调用的代码中。


0
投票

代码如下:

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

frmMain 是具有 frmMyForm 静态变量的主窗体。比在我的代码中,无论我想在哪里使用它,我只需检查它是否不为空,而不是使用静态实例创建它,然后给予人们。

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

frmMain.objfrm.Close_this();

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

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


0
投票

您需要使用 ShowDialog 而不是 Show 这就是问题所在。显示不阻止应用程序并且代码继续运行。

当 GUI 创建对象时,您正在处置该对象(即异常所说的内容)

尝试一下:

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

注意 ShowDialog()

© www.soinside.com 2019 - 2024. All rights reserved.