2010-07-21 163 views
0

我正在編寫一個C#.NET應用程序。我有一個表格。當表單創建時,我創建一個類的實例。當我關閉表單時,我想要處理這個類,以便下次打開表單時,我可以創建一個新的類的新實例。所以,在form_Closing事件中,我添加了這樣的代碼:classInstance = null;問題是,出於某種原因,下次打開表單時,類不等於null,而是它與我在關閉之前處於相同狀態表格。這是爲什麼發生?我怎樣才能讓課程「重設」?

編輯:添加信息:

將myHandler是在Form類的字段。 它看起來像這樣:

private HSFW_Handler myHandler; 

我指的類是單身,所以我創造這樣的:

public static HSFW_Handler GetInstance() 
    { 
     if (myHSFW == null) 
     { 
      myHSFW = new HSFW_Handler(); 
      return myHSFW; 
     } 
     else return myHSFW; 
    } 

我在Form_Shown事件創建它的初始實例

private void SetupDialogForm_Shown(object sender, EventArgs e) 
    { 
     try 
     { 
      myHandler = HSFW_Handler.GetInstance(); 
      UpdateDisplay(); 

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

表單閉幕看起來像這樣...

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     myHandler = null; 
    } 
+0

你能這樣減少對演示該問題的一個片段。表單創建/顯示代碼和關閉代碼。 – ChrisF 2010-07-21 20:47:24

+1

「當創建表單時,我創建了一個類的實例。」 - 當您下次打開表單時,您確定不會創建該類的另一個實例嗎? – dtb 2010-07-21 20:48:21

+0

可能還有其他事情正在進行。你還對班上做了什麼? – MCain 2010-07-21 20:48:46

回答

3

讓我們看看這個代碼:

public static HSFW_Handler GetInstance() 
{ 
    if (myHSFW == null) 
    { 
     myHSFW = new HSFW_Handler(); 
     return myHSFW; 
    } 
    else return myHSFW; 
} 

這:

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    myHandler = null; 
} 

注意什麼?

您在設置myHandlernull;但這似乎是SetupDialogForm的實例級別成員。或者無論如何,它與myHSFW不一樣,它是HSFW_Handler類中的靜態變量。

當你做到這一點...

myHandler = HSFW_Handler.GetInstance(); 

...你讓myHandler到同一個對象的引用指向HSFW_Handler.myHSFW;但他們仍然是兩個單獨的參考。設置一個到null對另一個沒有影響。

所有這一切的一點是,您需要實際上將myHSFW的值更改爲null以獲得您所期望的行爲。

我會做這樣的:

public class HSFW_Handler 
{ 
    public static void DeleteInstance() 
    { 
     myHSFW = null; 
    } 
} 

然後:

private void SetupDialogForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    HSFW_Handler.DeleteInstance(); 
} 
+0

嗯我明白你的意思,但我試過了,它似乎仍然沒有工作...... – PICyourBrain 2010-07-21 21:24:54

+0

@Jordan:什麼是在你的'HSFW_Handler'構造函數中? – 2010-07-21 22:01:15

+0

其實我剛剛得到它。你的解決方案工作,我只需要另外設置一個null。謝謝。 – PICyourBrain 2010-07-21 22:31:57

0

你確定form_Closing事件正在被觸發,所以你正在關閉表單而不是隱藏它嗎?

如果是這樣,那麼在每次將classInstance設置爲某事時尋找代碼。您可能會在構造函數或其他事件(如Load或Shown)中或周圍找到罪魁禍首。

+0

是的,我相信它被解僱了。看看我上面添加的代碼。 – PICyourBrain 2010-07-21 20:58:04