正确关闭二级表格VS申请退出

时间:2015-07-29 19:12:53

标签: c# forms winforms

这可能是一个标准问题。我已经阅读了很多这方面的文章,但没有人指出我具体的问题。

我正在开发一个WinForm并且有一个在启动时加载的“主菜单”表单。在这个主要内容中有几个按钮,用于打开程序的各个模块(其他形式)。

我可以打开表单没问题,可以关闭它并重新显示主表单没问题。问题在于当用户点击控制框中的(X)时,应用程序不会退出,因为主窗体仍在那里,但是隐藏了。我知道我可以在表单的close事件中放入application.exit()。但是,如果我有一个关闭表单并希望取消隐藏主表单的按钮,则应用程序将因formclosing事件而关闭。

有人可以帮助我理解这个原则。我不认为它应该像我看起来那么难,我真的不想使用Panels。

提前致谢。

-Joseph

以下代码根据下面提供的答案解决了问题

private void btnHome_Click(object sender, EventArgs e)
{
    Form f1 = Application.OpenForms[0];
    f1.Visible=true;

    this.Close();
}

private void frmCostControlMain_FormClosed(object sender, FormClosedEventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible==true)
    {
        f.BringToFront();
    }
    else
    {
        Application.Exit();
    }
}

2 个答案:

答案 0 :(得分:3)

您可以查看Application.OpenForms并查看当前表单以外的某些非隐藏表单是否存在。如果您只想查看主表单,可以查看Application.OpenForms[0]。因为它首先被打开,所以它总是在索引0处。来自内存:

Form_Closed(object sender, EventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible) {
        f.BringToFront();
    } else {
        Application.Exit();
    }
}

单击关闭按钮时,您将首先取消隐藏主窗体,然后关闭当前窗体。

答案 1 :(得分:0)

我仍然不明白你的问题,但我想你可以使用 Application.Exit()。 然后,您应该检查FormClosed事件的参数。 关闭原因如下:

点击[X]: CloseReason = UserClosing

申请退出: CloseReason = ApplicationExitCall

然后你可以正确处理它

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExitCall) 
    {
        //Application.Exit();
    }
    else if (e.CloseReason == CloseReason.UserClosing)
    {
        //[X] was pressed
    }
    else 
    {
        //Many other reasons
    }
}

我想处理您的问题有很多更清洁的方式如果您提供了一些更多详情,我认为有人可以帮助您。