2013-08-22 78 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