【问题标题】:What can cause a form not to close itself?什么会导致表单无法自行关闭?
【发布时间】:2013-03-20 00:09:37
【问题描述】:

我想知道是什么导致表单无法关闭。

我有一个很大的表单,有几个TabControls、DataGridViews和很多DataBound-Controls,至少涉及到10个BindingSources。 (这就是为什么我不能在这里发布我的代码,抱歉)。

现在,我遇到了一个问题,即在开发中的某个地方(只是重构)表单停止正确关闭。当我单击关闭按钮(红十字框)时,我会通过 FormClosing 和 FormClosed 但没有任何反应。 VisualStudio2008 调试并在抛出所有错误时暂停并没有提到出现问题,表单只是停留在原处。

什么可能导致这种行为?不是FormClosing-Event中的e.Cancel设置了!

一步一步将我的更改合并到另一个干净的工作副本后,表单正确关闭,但抛出异常:

带有消息的ArgumentNullException:“值不能为空。参数名称:组件”。在调用 base.Dispose(disposing) 行时,它会在 Form.Designer.Dispose 中抛出。

似乎与DataBinging有关,欢迎任何提示。

我将放入 StackTrace,它实际上是任何 DataBound 控件,据我从 StackTrace 中了解,它是一个 TextBox - 我没有启用 Framework Source Stepping,所以我不知道是什么文本框在此处中断。

bei System.ComponentModel.ReflectPropertyDescriptor.RemoveValueChanged(Object component, EventHandler handler)   
bei System.Windows.Forms.BindToObject.CheckBinding()   
bei System.Windows.Forms.Binding.CheckBinding()   
bei System.Windows.Forms.Binding.SetBindableComponent(IBindableComponent value)    
bei System.Windows.Forms.ControlBindingsCollection.ClearCore()    
bei System.Windows.Forms.BindingsCollection.Clear()   
bei System.Windows.Forms.ControlBindingsCollection.Clear()  
bei System.Windows.Forms.Control.ResetBindings() 
bei System.Windows.Forms.Control.Dispose(Boolean disposing)  
bei System.Windows.Forms.TextBox.Dispose(Boolean disposing)  
bei System.ComponentModel.Component.Dispose()  
bei System.Windows.Forms.Control.Dispose(Boolean disposing)   
bei System.ComponentModel.Component.Dispose()  
bei System.Windows.Forms.Control.Dispose(Boolean disposing)  
bei System.ComponentModel.Component.Dispose()  
bei System.Windows.Forms.Control.Dispose(Boolean disposing)   
bei System.ComponentModel.Component.Dispose()   
bei System.Windows.Forms.Control.Dispose(Boolean disposing)   
bei System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)   
bei System.ComponentModel.Component.Dispose()   
bei System.Windows.Forms.Control.Dispose(Boolean disposing)   
bei System.ComponentModel.Component.Dispose()   
bei System.Windows.Forms.Control.Dispose(Boolean disposing)    
bei System.Windows.Forms.TabControl.Dispose(Boolean disposing)   
bei System.ComponentModel.Component.Dispose()    
bei System.Windows.Forms.Control.Dispose(Boolean disposing)  
bei System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)  
bei System.Windows.Forms.Form.Dispose(Boolean disposing)  
bei My.BaseForm.Dispose(Boolean disposing) in BaseForm.Designer.cs:Zeile 30.  
bei My.InheritedForm.Dispose(Boolean disposing) in InheritedForm.Designer.cs:Zeile 25.   
bei System.ComponentModel.Component.Dispose()  
bei System.Windows.Forms.Form.WmClose(Message& m)  
bei System.Windows.Forms.Form.WndProc(Message& m)    
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)  
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)    
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

好的,知道了,随着框架源步进工作(为什么它如此复杂),我可以弄清楚数据绑定失败的原因。它是对在运行时为空的对象的属性的数据绑定。感谢您的帮助。

PS:我很抱歉那些对我生气的人,但我明确提出了这个问题,因为我没有得到这些全天的答案。很高兴提醒我这些可能的失败,但如果我确实声明与此无关,请不要幼稚地假装这个。

【问题讨论】:

  • “FormClosing-Event中的e.Cancel不是设置的!”你怎么知道?这个 e.cancel 可以在父对象中设置。
  • 您是否检查过表单关闭后没有重新创建?我认为在此之后表单可以正常工作? gui线程没有被阻塞或什么?当然,这是在关闭时检查取消属性之后,因为它是最常见的。
  • 不,它没有被重新创建。我可以看到 DataGridViews 被清除(但没有删除行,只清除了所有字段)。
  • @serhio - 我知道,因为我检查过了。

标签: winforms data-binding dispose


【解决方案1】:

我认为您的 10 个绑定源中的一个有错误(在您的许多数据绑定控件之一中)并且没有将您从某个字段中释放出来。如果数据绑定中出现错误,VS 就不是很透明,并且问题确实被默默地吞没了。

不过,如果是这样的话:

当我点击关闭按钮(红十字框)时,我会经历 FormClosing 和 FormClosed

那么这与我的理论有些矛盾。

为什么不尝试逐个解耦数据绑定,然后看看是否可以关闭表单?

【讨论】:

  • 好主意,我会试试这个。我认为它一定是某种形式的东西......
  • 正如您在消除故障后得到的 StackTrace 中看到的那样,它确实与数据绑定有关。谢谢你的提示。
【解决方案2】:

如何防止表单关闭的示例:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    e.Cancel = true;
    base.OnFormClosing(e);
}

也许这个表单是被继承的,当某些条件不满足时,一个基类会阻止表单关闭。

最后,如果您没有找到任何解决方案,您可以通过 .NET Framework 代码进行调试,看看表单的 OnClosing 方法会发生什么。 p>

【讨论】:

  • 谢谢,但这不是我提出问题的本意,我不需要知道如何防止这种情况发生,但如何意外/不需要地防止这种情况发生。
  • 感谢您否决我的帮助。在您的代码Cancel = true 中搜索,例如,伙计。或检查您的 OnClosing 事件覆盖。
  • 1.我对每一个答案都很满意。 2. 您是否收到拒绝您投票的消息? 3. 你的回答没有回答我的问题 - 所以投反对票是非常正确的。
【解决方案3】:

即使通过您的 Form_Closing 事件处理程序,也可以阻止表单关闭。

private void Form1_Closing(Object sender, CancelEventArgs e) 
{

          e.Cancel = true;

}

检查您是否将 e.Cancel 设置为 true .. 在代码中阻止它关闭的任何位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2017-09-08
    • 2019-12-13
    • 2011-09-28
    • 2015-03-06
    • 2020-03-12
    相关资源
    最近更新 更多