2

在搜索 google 和 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 gray 更改 onclose 和 clean_form 仍然没有效果,(不应该显示子窗体的 Closing 事件中的消息框吗?因为它没有)

4

2 回答 2

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;
    }
}
于 2011-02-28T10:31:22.613 回答
0

我想我明白了!我改变了两件事。1 我确保我没有在任何地方调用 this.dispose,因为这将导致处理(不关闭)任何子表单,因此不会调用 onclosure 事件。2.检查主菜单是否可以关闭时的foreach循环,生成的集合被修改错误。所以有了这个我确保它以正确的顺序关闭thnx 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();
            }
于 2011-02-28T13:13:50.850 回答