2013-06-28 31 views
-1

我正在創建一個簡單的Windows窗體應用程序,此窗體在初始化時創建多個新對象,在某些情況下(出現錯誤時)會向用戶顯示帶有某些文本的消息框對話框。多次調用Windows窗體構造函數

我的問題是,如果發生錯誤,消息對話框會多次出現。當檢查爲什麼會發生這種情況時,我發現窗體應用程序的構造函數被多次調用,其中四次是確切的。不知怎的,我不認爲這是正常的行爲...

我的應用程序由一個MainWindow.cs文件中的Main();

public MainWindow() 
    { 
     InitializeComponent(); 
     Setup(); 
    } 

    private void Setup() 
    { 
     stuff = new Stuff(this); 
    } 

    public static void Main() 
    { 
     Application.ThreadException += Application_ThreadException; 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
     Application.Run(new MainWindow()); 
    } 

Stuff構造函數裏面是正在顯示MessageDialog地方。

在構造函數MainWindow()中添加一個斷點我可以看到它被多次調用。

有人能告訴我爲什麼這是,如果有什麼我可以做,以防止它發生?

我試圖通過使用boolean變量來抑制對話框,但因爲對象被重新創建我不能做到這一點(也不應該有反正...)

+0

不,構造函數不會被多次調用(在您發佈的代碼中)。萬一你的斷點被多次碰撞......一個有用的提示可能是檢查完整的堆棧跟蹤... –

+0

線程可能?或Application.Run(新的MainWindow())它不應該調用另一個窗體而不是它自己? – Edper

+0

@Edper線程不應該是一個問題,因爲我還沒有創建任何新線程來處理該窗口。由於它是在靜態方法Main中調用的,因此Application.Run不會自行調用。 – Sander

回答

0

你不應該在構造函數中放置一個消息框。來電者應該處理任何異常,他應該顯示消息框

private void Caller() 
{ 
    try 
    { 
     frmStuff frm = new frmStuff(); 
     frm.Show(); 
    } 
    catch 
    { 
     //show your messagebox here 
    } 
} 
+0

每次創建對象時都不會顯示Messagebox,只是向用戶顯示錯誤(如我的問題所述)。 – Sander

+0

此外,「調用者」是一個構造函數 – Sayse

+0

在你的情況下調用者是'安裝程序()'我知道消息箱並不總是顯示。根據這是否導致異常,如果不是,您可以在表單加載中移動對象初始化 –