2009-09-16 70 views
0

我想弄清楚如何簡單地顯示一個WinForms對話框(代碼如下)時,我得到以下異常和callstack。這不會一直髮生,但我在異常日誌中看到它。有任何想法嗎?我無法弄清楚什麼會引用一個處置對象?System.ObjectDisposedException從簡單的窗體顯示

我已驗證(通過其餘調用堆棧)應用程序未關閉,它正常運行。

System.ObjectDisposedException: Cannot access a disposed object.  
Object name: 'MainForm'.  
    at System.Windows.Forms.Control.CreateHandle()  
    at System.Windows.Forms.Form.CreateHandle()  
    at System.Windows.Forms.Control.get_Handle()  
    at System.Windows.Forms.Control.GetSafeHandle(IWin32Window window)  
    at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)  
    at MyApp.MainForm.PromptForProfile()  
    at MyApp.MainForm.LoadProfile()  
    at MyApp.MainForm.barButtonItem1_ItemClick(Object sender, ItemClickEventArgs e) 

這是正在顯示的對話框的代碼。唯一的「愚蠢」代碼可能是textPassword_KeyDown處理程序。我應該拉出我想要的代碼,而不是以這種方式調用btnOK_Click。

public partial class ProfileForm : DevExpress.XtraEditors.XtraForm 
    { 
     public string _username; 
     public string _password; 

     public ProfileForm() 
     { 
     InitializeComponent(); 
     } 

     private void btnOK_Click(object sender, EventArgs e) 
     { 
     _username = textUsername.Text; 
     _password = textPassword.Text; 
     } 

     private void textPassword_KeyDown(object sender, KeyEventArgs e) 
     { 
     if (e.KeyCode == Keys.Enter) 
     { 
      btnOK_Click(sender, null); 
      this.DialogResult = DialogResult.OK; 
      e.Handled = true; 
     } 
     } 

     private void hyperLinkEdit1_Click(object sender, EventArgs e) 
     { 
     // show the proxy settings dialog 
     ProxyForm pform = new ProxyForm();   
     pform.ShowDialog();   
     } 
    } 
+0

對於點擊,你可以做'btnOK.PerformClick()' – 2009-09-16 02:55:18

+1

此外,它似乎並不可能猜測從您發佈的代碼的問題。一些事情可能像線程一樣發生,或者主要的形式引發了一個異常,迫使它關閉。檢查CrossThread通信。 – 2009-09-16 02:59:08

+0

我猜你可能應該在ShowDialog調用之後處理那個表單對象,或者使用using塊。 – 2009-09-16 03:00:22

回答

0

嘛,一個possibilily是,你設置的DialogResult就OK了,這將關閉該窗口,但你是指按Enter鍵觸發eventarg。 雖然我不太確定超鏈接edit1位的作用。它是在相同的形式,還是呼叫形式?

0

你的堆棧跟蹤告訴我你沒有進入ProfileForm代碼。它在某些控件的CreateHandle上失敗。沒有更多的信息,我只能猜測:

  1. 確認您正在執行您的GUI線程上發生的所有UI操作。即使你認爲是,仔細檢查。 (有時線程可能很微妙。)

  2. 確保您沒有嘗試兩次顯示相同的窗體實例,它已經被丟棄後的第二次。我看到你有一個ShowDialog()發生,但如果你正在嘗試ShowDialog()在已經被處置的窗體上,我希望它會像這樣爆炸。

  3. 確保窗體上的任何用戶控件行爲正常。

  4. 考慮在密碼字段中使用安全字符串。