关闭C#窗体应用程序

8
我有两个表格...当我启动应用程序并使用标题栏的关闭“X”时,整个应用程序都会关闭...现在,当我从第一个表格中选择一个选项,在我的情况下,它是一个名为“ADD”的按钮,因为它是电话簿应用程序...它转到第二个表格,因为我使用了1stform.hide()和2ndform.show()...现在,当我从标题栏中的“X”进行操作时,它不会完全关闭,因为第一个表格没有关闭...如何编程以使任何阶段整个应用程序都应该关闭。

你所说的“在任何阶段”,是指在任何形式上吗? - Shekhar_Pro
从任何表单中返回翻译的文本:是的...在我的情况下只有3个。 - Vinod K
4个回答

11
你的第一个表单被设置为启动表单,这意味着每当它关闭时,整个应用程序都会关闭。相反地,只有当它关闭时,应用程序才会关闭。因此,当你隐藏启动表单并显示第二个表单时,用户关闭第二个表单不会触发应用程序关闭,因为他们只关闭了一个次要的非模态对话框。
我建议改变你的设计,使启动表单也成为应用程序的主表单。没有必要试图绕过实际上可以有用的内置功能。你希望在关闭主表单时退出应用程序,无论打开了什么其他子窗体。
但是,在你的情况下,快速且简单的解决方案是调用Application.Exit。这将关闭所有当前打开的表单并立即退出应用程序。正如我刚才说的,我不太推荐这种方法,因为从每个表单的FormClosed事件处理程序中调用Application.Exit表明你的设计出了严重问题。

如果单一启动窗体的范式不适合您,您应该考虑自己动手并自定义Program.cs源文件中的Main方法。请参阅这个相关问题中给出的答案,了解如何实现。


@Vinod:我指的是 FormClosed 事件。该文档可在此处找到,但它只是由 Form 类公开的普通事件。您可以像订阅应用程序中的任何其他事件一样订阅它(例如 Button.Click)。 - Cody Gray
如果你使用任何版本的Visual Studio,它应该在表单的事件列表中可用。 - David Mårtensson

5
您可以使用表单的 FormClosing 事件,并添加以下代码:
Application.Exit();

这将停止整个应用程序,并关闭所有窗口。但是,如果有一个后台线程正在运行,进程本身将存活。在这种情况下,您可以使用:

Environment.Exit();

一个后台线程不会阻止进程退出,因为它会自动关闭。你可能是指前台线程。 - João Angelo
@João Angelo - 我的意思是,如果有多个线程在运行,只有 GUI 线程会关闭,应用程序似乎已经关闭,但进程仍然存在于进程列表中。感谢指出 :) - Øyvind Bråthen

2
在每个窗体的关闭事件中添加Application.Exit,例如:
首先创建一个关闭事件处理程序。
private void Form_ClosingEventhandler()(object sender, CancelEventArgs e)
{
      //Perform any processing if required like saving user settings or cleaning resources
      Application.Exit();
}

然后将此事件绑定到您创建的任何表单上。
//Where you create new form and show it.
Form1 frm= new Form1();
//set other properties
frm.Closing += new EventHandler(Form_ClosingEventhandler);
Form2 frm2= new Form2();
//set other properties
frm2.Closing += new EventHandler(Form_ClosingEventhandler);

2

当用户添加电话号码后,您肯定不希望关闭整个应用程序吧?您只需要确保您的主窗口再次变得可见即可。请按以下方式编写:

    private void AddButton_Click(object sender, EventArgs e) {
        var frm = new AddPhoneNumber();
        frm.StartPosition = FormStartPosition.Manual;
        frm.Location = this.Location;
        frm.Size = this.Size;   // optional
        frm.FormClosing += delegate { this.Show(); };
        frm.Show();
        this.Hide();
    }

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