打开多个窗体时出现ObjectDisposedException

时间:2010-07-15 19:59:22

标签: c# winforms exception

我的C#Winform应用程序遇到无法访问已处置对象的情况。处置对象是从登录表单上的按钮打开的表单(frmQuiz)。

情况:

我的应用程序通常同时打开两个或三个表单。 Program.cs文件从frmLoginBackground运行,这只是一个覆盖计算机屏幕的半透明背景。这个表单的load事件打开第二个表单frmLogin,其中包含一个打开frmQuiz的按钮,这是一个带有一些数学问题的简单表单。

frmLogin中打开frmQuiz的代码如下所示:

private void btnTakeQuizNow_Click(object sender, EventArgs e)
{
    frmQuiz quiz = new frmQuiz();
    quiz.TakeQuizNow("take_quiz_now", Convert.ToInt32(comboQuizMeNow.SelectedValue));  //Pass the form a quiz id number.
    quiz.Show();
}

当frmQuiz打开时,它和frmLogin都是打开的并且可以访问。

frmLogin还包含一个密码控件,可以通过首先打开frmSplash来打开管理表单,这是一个基于计时器的“Please Wait ...”启动表单。计时器Tick事件启动frmAdmin,这是管理表单。 frmLogin中的代码如下所示:

private void btnPasswordSubmit_Click(object sender, EventArgs e)
{
     //Password verification code snipped.

     frmSplash objSplash = new frmSplash();
     objSplash.Show();
   //this.Hide();
     this.Close();
}

frmSplash中的代码如下所示:

private void timer1_Tick(object sender, EventArgs e)
{
    frmAdmin objfrmAdmin = new frmAdmin ();
    objfrmAdmin.Show();
    this.Close();
}

当frmAdmin打开时,不再可以访问frmLogin;但是,frmAdmin包含一个“返回登录屏幕”按钮,其代码如下:

private void btnReturnToLogin_Click(object sender, EventArgs e)
{
    exitWarnings("return_to_login");
}

private void exitWarnings(string action)
{
    //Warning message code snipped.

    if (action == "return_to_login")
    {
        frmLogin objLogin = new frmLogin();
        objLogin.Show();
    }
}

frmLoginBackground保持打开状态,直到应用程序退出。


问题:

当frmLogin首次打开并单击按钮打开frmQuiz时,一切正常。测验表单打开运行正常。但是,在登录管理表单(关闭或隐藏登录表单)然后单击“返回登录屏幕”链接后,再次出现frmLogin后,单击按钮打开frmQuiz时会发生对象处置异常。 Visual Studio以黄色突出显示“quiz.Show();”代码行。无论天气如何,我都会使用“this.Close();”或者“this.Hide();”在btnPasswordSubmit_Click事件中。

任何人都可以提出一个解决方案,允许我从frmAdmin返回frmLogin后打开frmQuiz。

干杯,弗雷德里克

1 个答案:

答案 0 :(得分:0)

由于您在quizz之前为quizz.Show()创建了一个新实例,因此它无法自行调用抛出异常。

仔细查看frmQuiz的构造函数和FormCreate事件。看起来这就是死马被踢的地方。