【问题标题】:Closing one child-form closes other child-form关闭一个子窗体关闭另一个子窗体
【发布时间】:2013-08-23 02:31:32
【问题描述】:

在下面的代码中,Form1 打开另外两个Forms,然后关闭其中一个。结果是第二个子窗体也被关闭了。为什么?

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 执行时不会发生这种情况(既不是调试也不是发布)。它仅在作为 clickonce 应用程序安装时发生,然后 - 即使我只是单击可执行文件(在 AppData 文件夹下)。(也许还有其他一些代码阻止它发生在从 VS 执行,但我还没有找到什么。)可能是什么导致了这种差异?也许是 clickonce 中的某种类型的优化,而在常规发布模式下没有完成?)

【问题讨论】:

  • 是时候打开Reflector
  • @SriramSakthivel 我假设您的意思是最后一段。好主意。谢谢。
  • 不,我可以使用 VS 本身重现

标签: c# .net winforms


【解决方案1】:

将您的代码更改为可行的代码:

  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,发生的情况是:

当调用 form2.showDialog() // 父窗口是窗体 3,因为 GetActiveWindow 方法获取正在显示的窗口,而 form1 不是活动的或显示的

当你强制父母: 当调用 form2.showDialog(this) // 父窗口是 form 1 因为你定义了固定

【讨论】:

  • 你能解释一下吗?这行得通。但为什么不这样呢?
  • 在不启动计时器的情况下运行旧代码。休息一下,看看Form3的父级是什么。我怀疑父级将被设置为 Form2(因为它是显示 Form3 时最顶层的表单)。
  • 谢谢。但是请注意:尽管docs 同意您的观点-实际上,所有者似乎为空(在我的版本中)。您可以通过在 Tick 处理程序中添加 MessageBox.Show(f2.Owner.Text); 来查看这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多