我的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