2013-08-22 111 views
4

在下面的代碼中,Form1打開另外兩個Form s,然後關閉其中一個。結果是第二個子表單也被關閉了。爲什麼?關閉一個子表格關閉其他子表格

public partial class Form1 : Form 
{ 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 }; 

    public Form1() 
    { 
     InitializeComponent(); 
     ShowForm3(); 
     (new Form2()).ShowDialog();//If this is changed to 'Show' - it doesn't get closed. 
    } 

    void ShowForm3() 
    { 
     Form3 f3 = new Form3(); 
     f3.Show(); 
     timer.Tick += (sender, e) => f3.Close(); 
     timer.Start(); 
    } 
} 

Form2Form3是默認VS形式。在原始代碼中(當然,這裏的代碼太長了)在Visual Studio中執行時,不會發生這種情況(既不是Debug也不是Release ),它只會在安裝爲clickonce應用程序時發生,然後 - 即使我只是單擊可執行文件(在AppData文件夾下)(也許還有一些代碼可以阻止它在VS中執行時發生,但是)可能是導致這種差異的原因是什麼?或許某種類型的clickonce優化在常規發佈模式下不能完成?)

+0

它是th e時間打開'Reflector' –

+0

@SriramSakthivel我假設你是指最後一段。好主意。謝謝。 – ispiro

+0

不,我可以用VS自己重現 –

回答

5

將您的代碼更改爲可以工作的代碼:

public partial class Form1 : Form 
    { 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 }; 

    public Form1() 
    { 
     InitializeComponent(); 
     ShowForm3(); 
     (new Form2()).ShowDialog(this); 
    } 

    void ShowForm3() 
    { 
     Form3 f3 = new Form3(); 
     f3.Show(); 
     timer.Tick += (sender, e) => f3.Close(); 
     timer.Start(); 
    } 
    } 

解釋:當你沒有通過形式母公司,該窗口將活動窗口父母使用這種方法:GetActiveWindow,什麼是happend是:

調用form2.showDialog時()//父窗口是窗體3,因爲GetActiveWindow方法獲取正在顯示的窗口,並且form1不是活動的或者顯示爲

當您強制父級時: 當調用form2.showDialog(this)//父窗口是表1因爲你定義了固定的

+0

你能解釋一下嗎?這工作。但爲什麼不這樣做呢? –

+0

運行舊代碼而不啓動計時器。打破並查看Form3的父項是什麼。我懷疑父母將被設置爲Form2(因爲它是Form3顯示時的最頂層表單)。 –

+0

我使用解釋編輯 – renefc3