如果隐藏表单有未保存的更改,则c#取消关闭应用程序

时间:2011-02-28 10:24:45

标签: c# .net winforms forms formclosing

搜索谷歌和stackoverflow后我无法找到一个帮助我在我的情况下的答案。我有一个带有开始菜单(表单)的应用程序。当用户按下(任意)表格的X(关闭)时,我重新加载开始菜单。现在当该(菜单)表单关闭时,我想检查并通知用户现在任何隐藏的表单处于编辑模式(有或没有未保存的更改)如果用户按下取消我想显示该表单并停止关闭应用程序。现在我的问题是如何阻止应用程序停止在其他表单的代码中。我有一个覆盖调用this.close的子窗体的dispose方法,所以ok / cancel消息框显示但是在MB之后,开始菜单关闭,无论如何停止程序。我应该寻找一种处理这些东西的不同方法,还是要修改方法或事件处理程序以便这个/ \可以工作?

编辑: 好的,这是代码的一部分,按照被调用的顺序。我哪里出错?

private void Menu_FormClosing(object sender, FormClosingEventArgs e)
    {
       Global.Forms.Remove(this);
        if (!Global.Clean_Forms())
        {
            e.Cancel = true;
            Global.Forms.Add(this);
        }
    }

public static void Clean_Forms()
    {


        foreach (Form f in Forms)
            {
                if (f is Menu)
                {
                    //do nothing
                }
                else
                {
                    if (!f.IsDisposed)
                    {


                        f.Close();
                    }

                }

            }
        if (Forms.Count != 0)
        {
            isClean = false;
           /* String a = "";
            foreach (Form f in Forms)
            {
                a += f.ToString() + ": ";
            }
            MessageBox.Show(a);*/
        }
        else
        {
            isClean = true;
        }

    }

然而,这不起作用,应用程序就会关闭。

随机形式的结束事件处理程序

private void persoon_form_FormClosing(object sender, FormClosingEventArgs e)
    {

        if (editing)
        {
            DialogResult dr;
            dr = MessageBox.Show("uw wijzigingen gaan verloren. Doorgaan?", "sluiten", MessageBoxButtons.OKCancel);
            if (dr == DialogResult.Cancel)
            {
                e.Cancel = true;


            }
            else if (dr == DialogResult.OK)
            {
                Global.size = this.Size;
                Global.position = this.Location;
                Global.Forms.Remove(this);
                Form f = Global.menu();
                f.Show();
                this.Dispose();
            }
        }//somethingelse}
编辑:@cody grey更改onclose并且clean_form仍然没有效果,(不应该显示子窗体的Closing事件中的消息框吗?因为它没有)

2 个答案:

答案 0 :(得分:7)

您不应该在Dispose方法中执行此操作。相反,请尝试处理FormClosing event

此事件在表单关闭之前发生,因此您可以检查所需的状态,并在必要时通过将e.Cancel设置为True来取消关闭。

例如:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    // Check to see if the user is allowed to close this form
    if (!allowClose)
    {
       // Prevent this form from being closed
       MessageBox.Show("This form cannot be closed yet!");
       e.Cancel = true;
    }
}

答案 1 :(得分:0)

我想我想通了!我改变了两件事。 1我确保我没有在任何地方调用this.dispose,因为这会导致处理(不关闭)任何子表单,因此不会调用onclosing事件。 2. foreach循环检查主菜单是否可以关闭生成的集合时修改了错误。因此,我确保它以正确的顺序关闭,而Cody Gray指出我正确的方向:

Stack<Form> stack = new Stack<Form>();
            foreach (Form f in Forms)
            {
                if (f is Menu)
                {
                    //do nothing
                }
                else
                {
                    if (!f.IsDisposed)
                    {


                        stack.Push(f);
                    }

                }

            }
            for (int i = 0; i < stack.Count; i++)
            {
                Form temp = stack.Pop();
                temp.Close();
            }