代码之家  ›  专栏  ›  技术社区  ›  Kevin Vaughan

什么会导致窗体无法自行关闭?

  •  2
  • Kevin Vaughan  · 技术社区  · 16 年前

    我有一个大表单,有几个TabControls、datagridview和许多DataBound控件,至少涉及10个BindingSources(这就是我不能在这里发布代码的原因,对不起)。

    现在,我遇到了一个问题,在开发过程中的某个地方(只是重构),表单停止了正确关闭。当我点击“关闭”按钮(红十字框)时,我经历了FormClosing和FormClosed,但之后什么也没有发生。VisualStudio2008具有调试功能,并在抛出所有错误时暂停。如果事件未提及发生了错误,窗体将保持原样。

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

    ArgumentNullException,消息为:“该值不能为null。参数名称:组件”。调用base.Dispose(disposing)行时,它将抛出Form.Designer.Dispose。

    我会放在StackTrace中,它实际上是任何一个数据绑定控件,从StackTrace中我了解到,它是一个文本框-我没有启用框架源代码单步执行,所以我无法确定文本框在这里出现了什么问题。

    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)
    

    好的,明白了,随着框架源代码步进工作(为什么它如此复杂),我可以找出数据绑定失败的原因。它是对运行时为null的对象属性的数据绑定。谢谢你的帮助。

    PS:我为那些对我生气的人感到抱歉,但我明确地提出了这个问题,因为我没有得到那些整天的答案。提醒我这些可能的失败是很好的,但如果我真的说不是这样的话,不要孩子气地假装这样。

    3 回复  |  直到 13 年前
        1
  •  2
  •   hawbsl    16 年前

    尽管如此,如果是这种情况:

    当我点击关闭按钮(红色十字框)时,我进入FormClosing和FormClosed

    那就有点违背我的理论了。

        2
  •  1
  •   serhio    16 年前

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

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

    最后,如果你没有达成任何解决方案,你可以 通过.NET Framework代码进行调试 看看你的表格里发生了什么 方法。

        3
  •  0
  •   abhilash    16 年前

    甚至可以通过表单关闭事件处理程序阻止表单关闭。

    private void Form1_Closing(Object sender, CancelEventArgs e) 
    {
    
              e.Cancel = true;
    
    }