关闭一个窗体然后调用另一个窗体

16

我想关闭当前的窗体(主窗体)并打开第二个窗体(表格)。

我已经尝试过:

private void buttonStartQuiz_Click(object sender, EventArgs e)
{
    this.Close();

    Form2 form2 = new Form2();
    form2.ShowDialog();
}

form2.ShowDialog()之后添加this.Close();也无效。

有什么提示吗?

编辑:值得一提的是,在form2.ShowDialog()之后添加this.Close()只会在我关闭新表单时才关闭。 如果我选择使用 form2.Show(),它会立即关闭两个窗体。

12个回答

36

更改

this.Close();

收件人:

this.Hide();

因为您无法关闭主应用程序窗口并希望应用程序在其后运行。 您必须隐藏主窗体或将主窗口更改为仍然打开的窗口。

在这种情况下,您必须在ShowDialog()结束后关闭主窗口。 然后,您必须在此按钮事件函数的结尾处添加this.Close()

您的新代码如下:

private void buttonStartQuiz_Click(object sender, EventArgs e)
    {
        // hide main form
        this.Hide();

        // show other form
        Form2 form2 = new Form2();
        form2.ShowDialog();

        // close application
        this.Close();
    }

但我确实想关闭它。虽然我猜我可以隐藏它,然后在退出form2时再调用它? - elvispt
@elvispt:是的,你可以这样做。将 this.Close(); 改为 this.Show(); - Svisstack
1
@elvispt:你可以在Form2()构造函数中添加一个类型为Form的参数。通过传递主窗口(this)作为参数,你可以从Form2中调用主窗口的Show函数。你可以将ShowDialog()更改为Show(),因为使用ShowDialog()方法会导致窗体被阻塞而难以显示。 - Svisstack
对不起,我不明白。在构造函数中应该做什么? public Form2(Form a)?如何在Form2_FormClosed事件中调用隐藏的窗体? - elvispt
1
elvispt:我建议你去学习一些面向对象编程的教程(最好是C#),因为你显然不知道他在说什么 :( - mnn
显示剩余3条评论

6

你可以操作ApplicationContext,但是.NET框架已经有了非常好的支持窗口模式的WindowsFormsApplicationBase类。它的ShutdownStyle属性可用于让程序在最后一个窗口关闭后才关闭。请将Program.cs中的代码修改为以下内容:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;  // Add reference to Microsoft.VisualBasic!!

namespace WindowsFormsApplication1 {
  class Program : WindowsFormsApplicationBase {
    [STAThread]
    static void Main(string[] args) {
      var app = new Program();
      app.EnableVisualStyles = true;
      app.ShutdownStyle = ShutdownMode.AfterAllFormsClose;
      app.MainForm = new Form1();
      app.Run(args);
    }
  }
}

1

这对我来说运行良好...

private void button_Name_Click(object sender, EventArgs e)
    {
        form_2 Form2 = new Form2();
        Form2.ShowDialog();
        this.Close();
    }

虽然这可能回答了问题,但最好解释答案的基本部分,并可能解释OP代码中的问题。 - pirho

0
    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
        Form1 f1 = new Form1();
        f1.Show();
    }

这就是你所需要的


0
Form2 frm2 = new Form2();
frm2.ShowDialog();

并且

this.Close();

这不是一个好的组合...

frm2 实际上会被加载,但你甚至看不到它,因为 this.Close(); 只需要一毫秒就能关闭每个窗体...

this.Hide();

运行正常...


0

只需启用或禁用表单本身,而不是尝试关闭它。

代码示例:

this.enabled = false;

在点击事件或你想要的任何地方。

希望对你有所帮助。


0
this.Visible = false;
Form2 form2 = new Form2();
form2 .ShowDialog();
this.Close();

1
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - dbugger
但这是他问题的答案,请在说它不起作用之前尝试一下。他的问题是我想关闭当前所在的表单(MainForm),然后打开第二个表单(Form)。这就是答案。 - mahmoud_waheed
主要是要说明你的代码是做什么的,而不仅仅是放出一堆代码行。 - Cullub

0

只需将 this.Close() 替换为 this.Hide(),它就能完美地工作了!


-1
将此代码放在主窗体中。
private void mainform_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

对我有用。


-1

您正在先关闭表单,必须先加载第二个表单。

private void buttonStartQuiz_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
this.Close();
}

你测试过了吗? - user4227915

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接