2010-07-15 30 views
1

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

乾杯,弗雷德裏克

回答

0

既然你只是quizz.Show()之前創建quizz一個新的實例就不能QUIZZ本身拋出異常。

請仔細閱讀frmQuiz的構造函數和FormCreate事件。看起來這是死馬被踢的地方。

+0

謝謝Henk。這使我指出了正確的方向。這個問題源於frmAdmin在點擊'Return to Login Screen'按鈕後保持打開狀態,並且frmQuiz的代碼不顯示測驗,如果frmAdmin處於打開狀態 - 儘管我不明白爲什麼這會導致對象處置錯誤。但現在已經修復了。 – Frederick 2010-07-15 22:13:27