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

时间:2015-06-23 09:29:15

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

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

通常当您调试软件时,如果它抛出其中一个错误,您将被带到代码中,您可以找到问题所在,但由于某种原因,此错误确实显示在调试器中,通过单步执行代码我已经设法将其缩小到它调用base.Dispose()时关闭的形式,并且只有当它以某种顺序关闭时才会缩小。

我有一个Main表单,每次用户点击连接时都会填充Mdichildren表单,它将处理所有表单并将其重新创建为标签

这种情况一直很好,但是现在突然之间就会出现一些事情。

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子窗体停用有关,我已经检查了父窗体设置正确,现在很多google搜索后丢失了。

按照代码启动表格。

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();
        }

    }

如果我以相反的顺序关闭表单,它们被打开它可以正常工作,但是如果我尝试关闭“帐户”表单,然后是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。

1 个答案:

答案 0 :(得分:0)

这是一场噩梦,如果我能够正确地调试它,本​​来可以更容易诊断。

我已经更改了部分代码以使表单处于活动状态,这有助于在标题选项卡更改时帮助设置对表单的关注(因为这些应始终显示相同的信息)

我用过这个

this.ActivateMdiChild(frm);

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

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

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