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

Daa*_*nvl 2 .net c# forms winforms 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;
        }

    }
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,应用程序只是关闭.

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

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}
Run Code Online (Sandbox Code Playgroud)

编辑:@cody grey更改onclose和clean_form仍然没有效果,(不应该显示子窗体的Closing事件中的消息框吗?因为它没有)

Cod*_*ray 7

你不应该在这个Dispose方法中这样做.相反,尝试处理FormClosing事件.

此事件表单关闭之前发生,因此您可以检查所需的状态,并在必要时通过设置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;
    }
}
Run Code Online (Sandbox Code Playgroud)