【问题标题】:base.dispose() causing Object Reference Not Set To An Instance Of An Objectbase.dispose() 导致对象引用未设置为对象的实例
【发布时间】:2015-09-09 00:39:35
【问题描述】:

我有一个我一直在开发的程序,它在关闭表单时突然开始抛出错误。

通常,当您调试软件时,如果它抛出这些错误之一,您会被带到代码中,您可以找到问题所在,但是由于某种原因,此错误确实会在调试器中显示,通过单步执行代码 i已设法将其范围缩小到它在关闭窗体上调用 base.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);

欢迎任何有关尝试追查错误原因的建议,因为我不知所措。

干杯!

编辑:使用 VS 2008,.net 3.5SP1

编辑 2:还将补充说,如果我在例外列表中打开 NRE 抛出,我仍然不会被带到手头的错误,只是在一个框中给我 NRE 错误,不会把我带到部分代码。

编辑 3:每当我首先关闭帐户表单(创建的第一个 mdi 子项)时,这似乎都会发生,如果我将其留到最后,它似乎工作正常,但是如果我先关闭它,无论最后关闭的表单是什么都会导致 NRE。

【问题讨论】:

  • @SonerGönül 我会看一下主要问题是因为这是在 Base.Dispose 上,实际上只有 2 个变量可见。表单(正确)和设置为 true 的处置标志,因此从这个意义上说没有空值,它似乎是 base.dispose 方法中的某些东西,您无法进入并找到它掉落的确切点

标签: c# .net visual-studio-2008 .net-3.5 infragistics


【解决方案1】:

嗯,这是一场噩梦,如果我能正确调试它,它可能更容易诊断。

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

我用过这个

this.ActivateMdiChild(frm);

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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2012-07-06
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多