【发布时间】: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