2013-08-30 20 views
1

我設計了一個pos軟件。這裏是一個3表單一個登錄表單,pos_authority表單,pos_user表單。pos_authority和pos_user用戶表單有一個註銷按鈕。當我點擊我想從形式退出,並希望顯示登錄form.when我登錄我隱藏登錄form.here是我的代碼從主窗體退出並在C#.NET中顯示登錄表單

private void blogout_button_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      foreach (Form f in Application.OpenForms) 
      { 
       if (f.Name != "login_form") 
       { 
        f.Close(); 
        new login_Form().Show(); 
       } 
      } 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

在這裏顯示異常 集合已修改按鈕;枚舉操作可能不會執行。

回答

2

Application.OpenForms在運行時獲取所有打開的表單,但是如果關閉一個打開的表單(將其從OpenForm中移除),則foreach語句會引發異常,說明集合已更改,這是真的。

要解決這類問題,你可以在開放的形式存儲到一個列表:

Application.OpenForms.Cast<Form>().ToList() 

或圓形遍歷集合其他方式 - 從最後到第一代替。

編輯:

擺脫異常,更換你的foreach (Form f in Application.OpenForms)foreach (Form f in Application.OpenForms.Cast<Form>().ToList()),我沒有測試它,但它應該在理論工作。

但是我認爲即使您糾正了異常,它也不會起作用 - 如果有多個打開的表單,您將最終顯示多個登錄表單。我建議你檢查你的整個設計並嘗試使用事件 - 你知道Windows窗體是事件驅動的!

+0

我在這裏執行這@ REX.i沒有得到一個適當的解決方案的人。 – mahfuz110244

+0

看到編輯部分擺脫異常。 – Rex

+0

thanx.it工作正常,沒有錯誤。 – mahfuz110244

0

在您的登錄表單中試試這個;

private void ButtonClick(object sender, EventArgs e) 
{ 
    Form aform = new Form(); 
    aform.Show(); 
    aform.FormClosing += FrmClosing; 
    Hide(); 
} 

private void FrmClosing(object sender, FormClosingEventArgs e) 
{ 
    Show(); 
} 

基本上,你(從登錄表單),聽取了其他形式的形式關閉事件,並在其發生時,你再次顯示登錄表單。爲我的節目工作。

+0

這裏其實我有一個錯誤的登錄表單顯示,但顯示異常集合被修改;枚舉操作可能不會執行。我想刪除這個異常,所以幫助plzzzz。 – mahfuz110244

+0

你實現了我發佈的代碼,仍然有相同的異常?這聽起來不太合適...... 嘗試執行上面的代碼。或者如果這對你不好,那麼請發佈堆棧跟蹤。 – Trent

+0

我這樣做的代碼,但顯示相同的exception.u告訴我做我的代碼在登錄表單以及我們的代碼也 – mahfuz110244

0

你的例外是因爲你在調用f.Close()刪除了de form,改變了在foreach循環的集合,從而無法繼續循環。

而且我認爲你應該從改變你的代碼:

new login_Form().Show(); 

到:

login_Form.Show(); 
+0

如果我這樣做,那麼它不能得到login_form。 – mahfuz110244

相關問題