2012-05-25 104 views
4

我想顯示一個MessageBox來確認退出之前讓表單關閉。所以,創建一個FormClosing事件。FormClosing()事件加載兩次

private void Form_Main_FormClosing(object sender, FormClosingEventArgs e) 
    { 
    //nothing here for now 
    } 

我有MessageBox顯示兩次。調試工具顯示代碼以某種方式通過FormClosing()兩次。即使在FormClosing()中沒有任何內容時,也會發生這種情況。我在我的整個代碼中搜索了FormClosing(),並且只有一個地方訂閱了它。我在兩個其他項目中使用了相同的FormClosing(),但這並沒有發生。任何人都可以給我一個指針?這對我沒有任何意義。

+1

您是否嘗試過重建解決方案? –

+2

什麼是堆棧跟蹤說到底如何到達那裏? –

+0

你可以發表你的代碼嗎?如果沒有代碼,那麼骨架至少? –

回答

2

最有可能的「猜測」是您正在訂閱事件兩次。如果您正在使用Designer,請記住檢查自動生成的設計器代碼。

如果您在事件上設置了斷點 - 您也可以調用Call Stack(http://msdn.microsoft.com/en-us/library/a3694ts5.aspx - Debug/Window/Call Stack)和你可以看到你的代碼被執行到了哪裏。

完全有可能直接調用一個事件處理程序(但可能不太可能會錯誤地執行);但查看調用堆棧可以幫助追蹤它。

最後 - 確保您在處理關閉事件時不要致電Application.Exit或類似物品 - 我相信這會觸發第二次射擊。

+0

OK, 爲了方便起見,我上傳了我的代碼在這裏: https://docs.google.com/open?id=0B3dcu0IKtxKxblRudlhVOE1rZWM 當我使用This.Dispose(),它加載的兩倍。當我使用This.Close()時,它永遠不會關閉。 現在,這個神祕的東西嚇跑了我。以前從未發生過。我有兩個其他表單應用程序使用相同的方法,他們工作得很好。幫幫我!!!!!!!! Visual Studio裏面的幽靈!!!!!! – CaTx

+0

我在之前搜索了Application.Exit。它不在整個解決方案中。 – CaTx

3

你不能調用要麼關閉和處置中的FormClosing事件處理程序

方法的形式關閉代碼應該是:

private void Form_Main_FormClosing(object sender, FormClosingEventArgs e) 
    { 
    DialogResult result = MessageBox.Show("EXIT?", "Exit Program", MessageBoxButtons.YesNo); 

    if (result != DialogResult.Yes) 
    { 
      e.Cancel = true; 
    } 
    } 
2

OK,我想它了。我有:

InitializeComponent();

在兩個地方。在刪除其中一個之後,事情按照他們應該的方式工作。