2011-10-27 84 views
1

當我打電話form.dispose()窗體始終調用Validating事件並顯示MessageBox消息。 如何防止form.dispose()執行時驗證事件不會觸發。驗證事件中有MessageBox.Show()消息,因此當form.Dispose()正在執行時,它們始終位於最前面。form.dispose()總是調用驗證事件並顯示彈出消息

這甚至有可能阻止退出?我使用的緊湊框架3.5

代碼:

public static void Close<T>(string formName) where T : Form 
{ 
    Form f = null; 
    if (Dict.TryGetValue(formName, out f)) 
    { 
     Dict.Remove(formName); 
     f.Dispose(); 
    } 
} 

和驗證事件

private void acPredmetObravnave_Validating(object sender, CancelEventArgs e) 
{ 
    if (....) 
    { 
     MessageBox.Show("Error"); 
    } 
} 
+1

可以顯示一些代碼?您應該嘗試在處理之前關閉表單並避免關閉此消息框。 –

+0

是的,我想避免form.dispose() – senzacionale

+0

上的此消息框您可以在調用f.Dispose()之前刪除事件處理程序的驗證事件。 – stuartmclark

回答

3

一個簡單的解決方案是:

public class MyForm: Form 
{ 
    public InternalClose = false; 

    // Your code... 


    private void acPredmetObravnave_Validating(object sender, CancelEventArgs e) 
    { 
     if (InternalClose) return; 
     if (....) MessageBox.Show("Error"); 
    } 
} 

然後

public static void Close<T>(string formName) where T : MyForm 
{ 
    MyForm f = null; 
    if (Dict.TryGetValue(formName, out f)) 
    { 
     Dict.Remove(formName); 
     f.InternalClose = true; 
     f.Close(); 
     f.Dispose(); 
    } 
} 
+0

Thx的想法,但我不能直接調用InternalClose通用類。你有什麼想法我怎麼稱呼它? – senzacionale

+0

@senzacionale:你爲什麼不能?如果你看到我寫了'where T:MyForm',那麼你的表單類具有該屬性... – Marco

+0

你是對的。您使用MyForm而不是表單。 Thx再次 – senzacionale

2

有沒有什麼明確的形式調用Dispose()的一個原因?

在窗體關閉之前,您不應該調用Dispose()。這使您有機會處理任何OnClosing或OnClosed事件所需的驗證,並禁用進一步驗證和消息框。

備註有關代碼:

  • 爲什麼Close方法通用?
  • 你不應該在靜態字典中持有表單引用。您可能會導致內存泄漏。
  • 在調用Dispose()之前,禁用驗證。嘗試使用CausesValidation屬性將其設置爲false。
  • 或者,在表單中,處理OnClosing事件並阻止進一步驗證。
+0

generic is becouse我檢查哪個表單是打開的,哪個不是我創建的字典...我明確地調用Dispose()因爲我使用CF並檢查哪一個被打開,哪一個不是。 – senzacionale

+0

所以你如何建議調用Dispose()? 「你可能會導致內存泄漏。」你確定?我正在清理字典關閉... – senzacionale

+0

從我看到你的方法不需要是通用的。請刪除及相關部件。除非您持有某些需要明確處理的文件或數據源的打開句柄,否則不需要調用Dispose()。只需禁用驗證並調用Close()。一旦沒有其他對象持有對你的表格的引用,表格將被GC自動收集。我正在討論將對象連接到其他靜態對象的一般做法。有些案例並不明顯。例如。如果你有靜態方法處理程序。粘貼的代碼似乎沒有任何會導致內存泄漏的內容。 –