是什么导致形式不能自我封闭?

时间:2010-01-25 10:02:21

标签: winforms data-binding dispose

我想知道什么可能导致表格不能关闭。

我有一个很大的表单,有几个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:对于那些对我生气的人我很抱歉,但我明确表示这个问题是因为没有得到那些全天的答案。很高兴提醒我这些可能的失败,但如果我确实说它不是这个,那么就不要假装这样做。

3 个答案:

答案 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 ..代码中的任何位置都阻止它关闭。