C#关闭所有表格

时间:2014-07-11 09:03:23

标签: c# forms

我的程序出了问题。

我有3个表格,第一个打开第二个表格,第二个表格打开第三个表格或返回第一个表格,第三个表格可以打开第一个表格或seceond表格。

这就是我打开第二张表格的方式

private void Open_second_form()
    {
        Form2 myForm = new Form2(Type_person);
        this.Hide();
        myForm.ShowDialog();
        this.Close();
    }

其他表格我开得很厉害。这是一个代码如何关闭表单。每个表格都有这种方法。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("Exit or no?",
                           "My First Application",
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Information) == DialogResult.No)
        {
            this.Close();
            Environment.Exit(1);
        }
    }

当我打开第三个表单时,我得到了一个3 MessagesBox,如果我打开第一个表单,我只得到一个MessageBox。

我希望在只获取一个MessageBox时关闭所有表单。

我尝试了很多解决方案,但任何一个都不起作用。 我试过Application.exit();

请帮帮我:)。

最好的问候Icet

9 个答案:

答案 0 :(得分:4)

您的确认信息很有趣,结果不明显= D

您的问题可能有两种解决方案。

1)如果用户选择关闭申请 - 不再显示确认

private static bool _exiting;

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!_exiting && MessageBox.Show("Are you sure want to exit?",
                       "My First Application",
                        MessageBoxButtons.OkCancel,
                        MessageBoxIcon.Information) == DialogResult.Ok)
    {
        _exiting = true;
        // this.Close(); // you don't need that, it's already closing
        Environment.Exit(1);
    }
}

2)使用CloseReason仅确认用户操作

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if(MessageBox.Show("Are you sure want to exit?",
                       "My First Application",
                        MessageBoxButtons.OkCancel,
                        MessageBoxIcon.Information) == DialogResult.Ok)
            Environment.Exit(1);
        else
            e.Cancel = true; // to don't close form is user change his mind
    }

}

答案 1 :(得分:4)

调用Environment.Exit(0);方法

 private void btnExit_Click(object sender, EventArgs e)
{
    Environment.Exit(0);
}

答案 2 :(得分:3)

我总是在菜单表单上使用此代码段。我希望这会有所帮助。

for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
    if (Application.OpenForms[i].Name != "Menu")
    Application.OpenForms[i].Close();
}

答案 3 :(得分:2)

对于表单1,考虑按钮称为btnForm1To2

private void btnForm1To2_Click(object sender, EventArgs e)
{
    using (Form2 myForm = new Form2(Type_person))
    {
        this.Hide();
        myForm.ShowDialog();
        this.Show();
    }
}

在FORM 2中,考虑第1页的按钮是btnForm2To1,第3页的按钮是btnForm2To3

private void btnForm2To1_Click(object sender, EventArgs e)
{
    // Just close the form 2, as it was called from form 1, this form will be displayed
    this.DialogResult = DialogResult.OK;
}

private void btnForm2To3_Click(object sender, EventArgs e)
{
    using (Form3 myForm = new Form3(...))
    {
        this.Hide();
        DialogResult form3result = myForm.ShowDialog();

        // Now handle the results from form 3 to navigate to form 2 or 1
        // In my example, form 3 replies Abort to go back to 1. On cancel (or other dialog results) we will stay on form 2
        if (DialogResult.Abort.Equals(form3result))
        {
            this.DialogResult = DialogResult.OK;
        }
        else
        {
            this.Show();
        }
    }
}

在FORM 3中,考虑第1页的按钮是btnForm3To1,第2页的按钮是btnForm3To2

private void btnForm3To1_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Abort;
}

private void btnForm3To2_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
}

如果您希望用户使用MessageBox确认他的点击,只需将它们放在每个按钮点击方法的this.DialogResult之前

答案 4 :(得分:1)

注意,这种方式比Environment.Exit(0);更快。

WPF

在( Closing )中设置窗口###Window.xaml事件

Closing="Window_Closing"

,然后进入( ###WWindow.xaml.cs

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    foreach(Window w in Application.Current.Windows)
        if(w != this)
            w.Close();
}

Windows窗体

  • 转到 Form#.cs [Design] >> Form#属性

  • 然后单击“事件”

  • 并双击FormClosing

在( Form#.cs )中

如果您要从启动表单中关闭,最好使用此代码。

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     for(int i = 1; i < Application.OpenForms.Count; ++i)
         Application.OpenForms[i].Close();
 }

其他适用于任何形式

 private void Form7_FormClosing(object sender, FormClosingEventArgs e)
 {
     for(int i = 0; i < Application.OpenForms.Count; ++i)
         if(Application.OpenForms[i] != this)
                Application.OpenForms[i].Close();
 }

答案 5 :(得分:0)

如果你想关闭除主表单以外的所有表单(特别是对话框窗口),我发现这个功能很有用。

        public static void closeAll()
    {
        FormCollection fc = Application.OpenForms;
        if (fc.Count > 1)
        {
            for (int i = (fc.Count); i > 1; i--)
            {
                Form selectedForm = Application.OpenForms[i - 1];
                selectedForm.Close();
            }
        }
    }

答案 6 :(得分:0)

Application.Current.Shutdown();

这就是我需要关闭整个应用程序时所使用的。它关闭所有表单,非常适合关闭所有表单。我不知道这是否正是您想要的。

答案 7 :(得分:0)

也许您发现自己想要隐藏所有 Windows,在某处清理一些东西然后干净地退出,这时您应该使用以下解决方案。

您的 MainWindow 的事件处理程序

OnClosing

private void OnClosing(object o)
{     
        // Quickly hide all Windows
        foreach (Window w in Application.Current.Windows)
        {
            w.Hide();
        }

        // Do some OnClosing stuff here
        
        // Release everything and close all Windows        
        Environment.Exit(0);
}

答案 8 :(得分:0)

我用过这个,它对我有用:

for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
        {
            if (Application.OpenForms[i].Name != "FRM01"&&Application.OpenForms[i].Name!= "FRM02")
                Application.OpenForms[i].Close();
        }

那些“FRM”的东西是我的表格的名称,你可以做的是添加尽可能多的表格作为“父母”。因此,每次迭代时,它都会检查这些表单的名称是否是您希望保留的名称。

如果您希望控制用户关闭父表单和子表单以使其仍然存在,我建议您将“for”添加到表单关闭处理程序中。

最好使用 MDI 表单 (MDI link here)