我的C#Winform应用程序遇到无法访问处置对象的情况。处理对象是从登录表单上的按钮打开的表单(frmQuiz)。ObjectDisposedException多个表单打开时
The Situation:
我的应用程序通常有两个或三个表单同时打开。 Program.cs文件以frmLoginBackground的形式运行,它只是一个覆盖计算机屏幕的半透明背景。此表单的加载事件打开第二个表单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还包含一个密码控制,通过首先打开基于计时器的“Please Wait ...”飞溅形式的frmSplash来打开管理表单。定时器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。
干杯,弗雷德里克
谢谢Henk。这使我指出了正确的方向。这个问题源于frmAdmin在点击'Return to Login Screen'按钮后保持打开状态,并且frmQuiz的代码不显示测验,如果frmAdmin处于打开状态 - 尽管我不明白为什么这会导致对象处置错误。但现在已经修复了。 – Frederick 2010-07-15 22:13:27