我想知道什么可能导致表格不能关闭。
我有一个很大的表单,有几个TabControls,DataGridViews和许多DataBound-Controls,至少涉及10个BindingSources。 (这就是为什么我不能在这里发布我的代码,对不起)。
现在,我遇到了问题,在开发中的某个地方(只是重新编写),表单正确地停止了关闭。当我点击Close-Button(Red-Cross-Box)时,我会通过FormClosing和FormClosed,但是没有更多的事情发生。 VisualStudio2008调试并在抛出所有错误时暂停,事件没有提到出错,表单就停留在原来的位置。
什么可能导致这种行为?并不是说FormClosing-Event中的e.Cancel已经设置好了!
在逐步将我的更改合并到另一个干净的工作副本后,表单正确关闭,但抛出异常:
带消息的ArgumentNullException:“值不能为null。参数名称:组件”。它在调用base.Dispose(disposing)行时抛出Form.Designer.Dispose。
似乎是DataBinging的东西,欢迎任何提示。
我会放入StackTrace,它实际上是任何DataBound控件,从我理解的StackTrace,它是一个TextBox - 我没有启用Framework Source Stepping,所以我无法弄清楚是什么TextBox在这里打破。
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)
好吧,得到它,随着Framework源步进工作(为什么它如此复杂)我可以弄清楚数据绑定失败了什么。它是对运行时为null的对象属性的数据绑定。谢谢你的帮助。
PS:对于那些对我生气的人我很抱歉,但我明确表示这个问题是因为没有得到那些全天的答案。很高兴提醒我这些可能的失败,但如果我确实说它不是这个,那么就不要假装这样做。答案 0 :(得分:2)
我认为你的10个绑定源中的一个有错误(在你的许多数据绑定控件之一)并且没有从某个地方释放你。如果数据绑定中存在错误并且无声吞下问题,则VS不是非常透明。
虽然如果是这样的话:
那么这有点与我的理论相矛盾。当我点击关闭按钮(红色交叉框)时,我通过FormClosing和FormClosed
为什么不尝试逐个解耦数据绑定,看看你是否可以关闭表格?
答案 1 :(得分:1)
如何阻止表单关闭的示例:
protected override void OnFormClosing(FormClosingEventArgs e)
{
e.Cancel = true;
base.OnFormClosing(e);
}
也许这个表单是继承的,并且当不满足某些条件时,基类会阻止表单关闭。
最后,如果您没有实现任何解决方案,您可以通过.NET Framework代码进行调试,并查看表单的 OnClosing 方法中发生的情况。
答案 2 :(得分:0)
即使从Form_Closing事件处理程序中也可以阻止表单关闭。
private void Form1_Closing(Object sender, CancelEventArgs e)
{
e.Cancel = true;
}
检查您是否将e.Cancel设置为true ..代码中的任何位置都阻止它关闭。