C# отменить закрытие приложения, если скрытая форма содержит несохраненные изменения

После поиска в google и stackru я не могу найти ответ, который помог мне в моей ситуации. У меня есть приложение с меню "Пуск" (форма). когда пользователь нажимает X(закрыть) (любой) формы, я перезагружаю стартовое меню. Теперь, когда эта (меню) форма закрывается, я хочу проверить и уведомить пользователя, находятся ли теперь все скрытые формы в режиме редактирования (с несохраненными изменениями или без них), если пользователь нажимает кнопку отмены, я хочу показать эту форму и остановить закрытие приложения. Теперь моя проблема заключается в том, как мне остановить остановку приложения в коде других форм. У меня есть переопределение метода dispose для подчиненных форм, который вызывает this.close, поэтому отображается окно сообщения 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 ответа

Решение

Я думаю, что я понял это! Я изменил две вещи. 1 Я позаботился о том, чтобы нигде не вызывать this.dispose, так как это приведет к удалению (не закрытию) любых дочерних форм, следовательно, не вызывается событие onclosing. 2. цикл foreach при проверке того, может ли главное меню закрыть сгенерированную коллекцию с измененными ошибками. поэтому, убедившись, что он закрывается в правильном порядке, Cody Grey указывает мне правильное направление:

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();
            }

Вы не должны делать это в Dispose метод. Вместо этого попробуйте обработать FormClosing событие

Это событие происходит до закрытия формы, поэтому вы можете проверить любое нужное вам состояние и отменить закрытие, если необходимо, установив e.Cancel к Истине.

Например:

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;
    }
}
Другие вопросы по тегам