【问题标题】:Form remains open in the background after closing it表单关闭后在后台保持打开状态
【发布时间】:2021-11-14 14:18:39
【问题描述】:

所以我想显示一个表单并关闭另一个表单,所以我在 form1 中执行了此操作:

    private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
    Form2 x = new Form2();
    x.Show();
    this.Hide();
    //didn't use this.close() cause then the whole program will close instead of 
    //just the current form
}

然后我希望在第二个表单关闭后再次打开主表单,所以我在 form2 中执行了此操作:

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Form1 x = new Form1();
        x.Show();
    }

现在的问题是当我在关闭第二个表单后回到主表单时。如果我关闭主窗体,它不会完全关闭并且仍然在后台保持打开状态(我在任务管理器中找到了它)。我认为这是因为“显示”方法只是打开另一个表单而不是让表单出现,所以隐藏的主表单仍然在后台运行。 我应该怎么做才能使表单在退出时关闭? 我试着把 this.close();在表单关闭和表单关闭事件中,但都导致崩溃。

【问题讨论】:

  • Form2_FormClosed 事件正在创建一个“新的”Form1,而From1 已经存在!所以你可能在代码中显示/关闭Form1,但它不是你想要显示或关闭的Form1。在newTaskToolStripMenuItem_Click……你试过了吗……x.ShowDialog() THEN,你可以关闭Form1。类似于... x.ShowDialog(); 然后 this.Close(); ... 由于表单显示为“对话框”,因此执行将“等待”直到 Form2 在调用 this.Close(); 之前关闭。
  • 另外……你应该注意一个特定的代码行……this.Hide();……基本上……当执行通过这行代码时……然后……从技术上讲……你失去了对form1的任何引用……这就是为什么你必须在form2 中“创建”一个新的Form1。您当然可以将form1 传递给form2,但是,如果您只是想在form2 关闭时关闭form1,则这是不必要的。只需使用form2.ShowDialog() 并按照您最初的意图使用this.Close()

标签: c#


【解决方案1】:

当你写作时:

 Form1 x = new Form1();

您正在创建一个 Form1 对象,因此x 指的是新对象而不是原始对象。相反,你可以使用这个:

private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
    using (var form2 = new Form2())
    {
        this.Hide();
        form2.ShowDialog();
    }
    this.Show();
}

ShowDialog()被调用时,它后面的代码直到对话框关闭后才会执行,所以this.Show()只有在Form2关闭后才会执行。

【讨论】:

  • 谢谢。你也能回答我关于代码的一些问题吗? “使用”关键字有什么作用? "(var form2 = new Form2())"-----> "var" 是让电脑设置数据类型吧?所以我可以说“Form2 form2 = new Form2()”,它仍然可以正常工作吗?
  • 当你使用ShowDialog()时,即使你关闭了表单,它实际上也存在于内存中,所以我们需要将其dispose。 using 关键字让我们无需手动执行此操作,并在表单关闭时自动执行此操作。我建议您阅读IDisposable 接口并阅读this 答案。
  • var x = new Form()Form x = new Form() 是一样的,它只是一个简写,让你不用写两次同样的东西。
【解决方案2】:

另一种选择是在创建 Form2 时简单地订阅 FormClosed() 事件,然后从那里取消隐藏 Form1 的实例:

// ... all in Form1 ...

private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.Hide();
    Form2 x = new Form2();
    x.FormClosed += X_FormClosed;
    x.Show();
}

private void X_FormClosed(object sender, FormClosedEventArgs e)
{
    this.Show();
}

那么当您关闭 Form2 时,您的 Form1 实例将自动重新出现。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多