我的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。
干杯,弗雷德里克
答案 0 :(得分:0)
由于您在quizz
之前为quizz.Show()
创建了一个新实例,因此它无法自行调用抛出异常。
仔细查看frmQuiz的构造函数和FormCreate事件。看起来这就是死马被踢的地方。