base.dispose()导致对象引用未设置为对象的实例

本文关键字:设置 对象 实例 对象引用 dispose base | 更新日期: 2023-09-27 17:59:12

我有一个程序,经过一段时间的开发,在关闭表单时突然出现错误。

通常情况下,当你调试软件时,如果它出现了其中一个错误,你会被带到代码中,你可以找到问题所在,但由于某种原因,这个错误确实会在调试器中显示出来,通过逐步查看我设法将其缩小到调用基时的代码。表单上的Dispose()是它的闭包,并且仅当它按特定顺序闭合时。

我有一个主表单,每次用户点击连接时,它都会用Mdichildren表单填充,它会处理所有表单,并将它们重新创建为选项卡

从那以后,这一直很好,但现在突然有什么东西开始引发NRE。

System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.Form.DeactivateMdiChild()
at System.Windows.Forms.Form.WmMdiActivate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg , IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.MdiClient.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

我可以看到这与Mdi子窗体的停用有关,我已经检查了父窗体的设置是否正确,经过大量的谷歌搜索,现在已经丢失了。

代码发布后的表格。

public void CheckIfExisits(Form MainForm, string DBASE, string ODBC, UltraToolbarsManager UTBM)
    {
        var ASQL = new Accounts.SQL.SummaryTab();
        var FSQL = new FocalPoint.SQL.SummaryTab();
        var WSQL = new WorkFlowForms.SQL.SummaryTab();
        var AVER = ASQL.DimVer(DBASE, ODBC);
        var FVER = FSQL.FPVer(DBASE, ODBC);
        var WVER = WSQL.WffVer(DBASE, ODBC);
        if (AVER != "0")
        {
            var FrmAccSum = new FrmAccountsSummary(DBASE, ODBC, UTBM) { MdiParent = MainForm };
            FrmAccSum.Show();
        }
        if (FVER != "0")
        {
            var FrmFPSum = new FrmFocalPointSummaryNew(DBASE, ODBC, UTBM) { MdiParent = MainForm };
            FrmFPSum.Show();
        }
        if (WVER != "0")
        {
            var FrmWFFSum = new FrmWorkFlowFormSummarys(DBASE, ODBC, UTBM) { MdiParent = MainForm };
            FrmWFFSum.Show();
        }
    }

如果我以与打开表单相反的顺序关闭表单,效果很好,但如果我尝试关闭Accounts表单,那么Focalpoint表单会出现NRE错误。

我可以提供关闭表单的代码,但由于我可以通过手动关闭表单来复制这一点,我认为这不是问题所在。

我的主要表格如下所示

                 SummaryFormLaunch SFL = new SummaryFormLaunch();
                SFL.CheckIfExisits(this, cmbDBASE.Text, cmbODBC.Text, ultraToolbarsManager1);

任何关于试图找出错误原因的建议都是受欢迎的,因为我不知所措。

干杯!

EDit:使用VS 2008,.net 3.5SP1

编辑2:还将添加一点,如果我在异常列表中为NRE启用Thrown,我仍然不会注意到手头的错误,只会在框中给我NRE错误,而不会注意到代码中的部分。

编辑3:每当我首先关闭"帐户"窗体(创建的第一个mdi子窗体)时,就会出现这种情况,如果我把它留到最后,它似乎可以正常工作,但如果我首先关闭它,无论最后关闭的窗体是什么,都会导致NRE。

base.dispose()导致对象引用未设置为对象的实例

这真是一场噩梦,如果我能正确调试它,诊断起来会更容易。

我更改了部分代码,使表单处于活动状态,这是为了在标题选项卡发生变化时帮助设置表单焦点(因为这些选项卡应该始终显示相同的信息)

我用过这个

this.ActivateMdiChild(frm);

现在这很好,也完成了我想要的工作(使正确的表单处于活动状态),但是当Base.Dispose进行处理时,它会查看ActiveMdiChild的Parent表单并尝试将其停用。

但由于活动的MdiChild已经被停用,这是一个空值,这导致了我的NRE错误。

这意味着我必须尝试找到另一种设置活动形式的方法,但至少这个随机问题现在已经消失了!