2015-10-18 80 views
-1

我在重新打開先前關閉的表單時遇到錯誤。我的代碼如下:無法訪問已處理的對象 - 新解決方案

private void opentfk_Click(object sender, EventArgs e) 
    { 
     tfkform.Show(); 
    } 

上面的代碼將打開預期其運作形式,我目前遇到的問題是,如果我決定我要關閉新開的形式(原始形式應該在後臺保持打開狀態),然後忘記對該表單進行更改。按下按鈕重新打開實際的表格。我遇到了一個stackoverflow異常,使我的應用程序崩潰。

該消息的原因是什麼?以及如何解決?據我所知,一旦在新打開的窗體上點擊X應該處理表單,以便重新打開它?

請注意,這是一個新創建的解決方案,唯一的主要變化是

拋出的異常的按鍵處理程序:在 System.Windows.Forms.dll中(「System.ObjectDispostedException」「無法訪問處理對象「)

+2

您顯示的代碼可能不會導致您的問題。您應該爲我們提供足夠的代碼來複制您的問題。 – Enigmativity

+0

@Enigmativity主窗體在主屏幕上目前有6個按鈕,爲每個按鈕添加一個處理程序。 6中的5個調用一個函數來顯示一個消息框,其中顯示「功能尚未提供」。沒有的按鈕。是提供的一個..正在打開的窗體是一個新添加的按鈕+文本框創建的winform。代碼 –

回答

2

單擊該第二個窗體上的X後,假設您不取消關閉事件,則窗體將被處置。你不能再次顯示它。

選項一是每次創建一個新實例,而不是試圖重用該實例。

private void opentfk_Click(object sender, EventArgs e) 
{ 
    var tfkform = new TfkForm(); 
    tfkform.Show(); 

    // or using (var tfkform = new TfkForm()) 
    //   tfkform.ShowDialog(); 
} 

選項二是訂閱第二個窗體的FormClosing事件。您可以取消關閉事件,而只是隱藏表單。然後,您可以再次顯示錶單,並且不會發生異常。

private void TfkForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 

    Hide(); 
} 
+0

'((Form)sender)沒有變化.Hide();' – Loathing

1

選項三是檢查您的表單引用是否爲空或已處置。以下是使用Form1和Form2的示例:

public partial class Form1 : Form 
{ 

    Form2 f2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (f2 == null || f2.IsDisposed) 
     { 
      f2 = new Form2(); 
      f2.Show(); 
     } 
     else 
     { 
      if (f2.WindowState == FormWindowState.Minimized) 
      { 
       f2.WindowState = FormWindowState.Normal; 
      } 
      f2.Show(); 
      f2.BringToFront(); 
     } 
    } 

} 
相關問題