2010-12-05 120 views
4

我一直在处理奇怪的问题。我在一个项目中使用KryptonForm。我有一个表单(比如说form1),我需要在这个表单上点击一个按钮来打开另一个表单。下面是代码:关闭对话框窗体关闭父窗体

void btn_click(object sender, EventArgs e) 
{ 
    Visible = false; 
    ShowInTaskbar = false; 

    var f = new Form2(); 
    f.ShowDialog(); 

    Visible = true; 
    ShowInTaskbar = true; 
} 

的问题是,当窗体2 关闭它关闭Form1中也。我曾尝试从Form2设置DialogResult = DialogResult.None,但无济于事。请帮帮我。

我总是使用这种技术,这件事从来没有发生过。

+0

您是否已经在调试器中逐步了解了这个问题,看看究竟发生了什么?可能还有一些其他代码正在执行,这里没有包含这些代码。 – Darbio 2010-12-05 12:32:51

+0

如果您注释掉此方法中的第2行,会发生什么情况?如果避免使Form1不可见并隐藏其TaskBar按钮,Form1是否仍然关闭? – Ran 2010-12-05 12:33:02

+0

父窗体(`form1`)实际*关闭*,还是只留*隐形*? – stakx 2010-12-05 12:47:40

回答

6

是的,这段代码很麻烦。用户关闭对话框时出错。然后,Windows必须找到另一个窗口来重点关注。您的应用程序中没有任何剩余内容,您的主窗口不可见。然后选择另一个应用程序的窗口。例如,好处是,这将成为Visual Studio中的一个窗口。一个大的。你的主要形式现在消失在它后面。

您需要确保您的主窗口再次可见之前对话框关闭。您可以通过订阅对话框的FormClosing事件处理程序来完成此操作。例如:

private void button1_Click(object sender, EventArgs e) { 
     using (var dlg = new Form2()) { 
      dlg.StartPosition = FormStartPosition.Manual; 
      dlg.Location = this.Location; 
      dlg.FormClosing += (s, ea) => this.Show(); // <=== Here 
      this.Hide(); 
      if (dlg.ShowDialog() == DialogResult.OK) { 
       // etc... 
      } 
     } 
    } 
0
  • 你有没有考虑例外?如果Form2引发异常,则不会执行最后一条语句Visible = trueShowInTaskbar = true。当您尝试这样会发生什么:

    ShowInTaskbar = Visible = false; 
    try 
    { 
        using (var f = new Form2()) // (added since Form2 is an IDisposable) 
        { 
         f.ShowDialog(); 
        } 
    } 
    finally // make sure that the following gets executed even when 
    {  // exceptions are thrown during f.ShowDialog(): 
        ShowInTaskbar = Visible = true; 
    } 
    

  • 当您打开另一种形式比Form2这个方法里面会发生什么?

    如果问题消失,问题可能不在此方法内,但与Form2

    如果问题仍然存在:您是否确定您在此方法中执行的操作完全相同,而不是您应用相同技术的其他方法?


  • 尝试删除第一行,看看问题是否仍然存在。或者以不同的方式提问:您的父母表单是否仅保留隐形或是否真的得到已关闭