Настройка программного закрытия

Я хочу установить CloseReason формы после вызова This.Close() внутри формы.

Обычно эта форма закрывается сама по себе вызовом This.Close(), но я хочу спросить пользователя, хотят ли они ДЕЙСТВИТЕЛЬНО закрыть форму и отправить mbox с некоторой информацией. Но у меня есть это:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

Но каждый раз я вызываю This.Close(); CloseReason всегда является UserClosing.

Могу ли я установить его после вызова или мне придется обрабатывать OnFormClosing разные?

Ответы

Ответ 1

Я не думаю, что вы можете это сделать, что я всегда делаю, это использовать флаг

appClosing = true;
this.Close();

И затем проверьте это:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing && !appClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

Ответ 2

Вместо создания дополнительной переменной:

appClosing = true; 
this.Close();

Вы можете позвонить:

Application.Exit();

И тогда e.CloseReason будет равен

CloseReason.ApplicationExitCall

Что может быть за то, что вам нужно.

Ответ 3

Способ, которым я начал это делать, - установить свойство DialogResult формы на разные вещи в зависимости от того, что пользователь нажал на форму.

В методе нажатия кнопки:

private void FillOrder_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
    // this.Close() is called automatically when you set DialogResult
    // so the above line will close the form as well.
}

Таким образом вы можете сделать следующее в методах FormClosing:

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.UserClosing:
            switch (this.DialogResult)
            {
                case DialogResult.OK:
                    // User has clicked button.
                    break;
                case DialogResult.Cancel:
                    // User has clicked X on form, show your yes/no/cancel box here.

                    // Set cancel here to prevent the closing.
                    //e.Cancel = true;
                    break;
            }
            break;
    }
}

Поскольку CloseReason всегда устанавливается в UserClosing, он устанавливается в это значение любым действием, которое может инициировать пользователь, не может точно помнить, что, но я уверен, что даже команда диспетчера задач убивает пользователя, Однако я могу подтвердить, что другие значения перечисления задаются в различных случаях, таких как выключение/перезагрузка, пока приложение все еще работает. Вы даже можете остановить закрытие окон, перехватив все причины в коммутаторе и отменив закрытие.

Ответ 4

CloseReason - это перечисление со следующими членами:

None
WindowsShutDown
MdiFormClosing
UserClosing
TaskManagerClosing
FormOwnerClosing
ApplicationExitCall

Это заставляет меня думать, что он зависит от условий, связанных с поведением форм в целом (например, закрытие родительской формы закрывает его дочерние элементы). Поэтому, чтобы аргумент arg сказал, CloseReason.ApplicationExitCall, событие должно быть вызвано вызовом Application.Exit.

То же самое, что сказать CloseReason.FormOwnerClosing, предполагая, что ваши дочерние формы вызывается с помощью формы. Show (Parent)

Если ваша цель состоит в том, чтобы просто получить дополнительную информацию о том, почему форма закрывается, вы можете просто сохранить ее внутри объекта формы в качестве публичного атрибута или свойства для доступа к ней позже, считая, что указанная форма не была удалена.

Предоставление вашей мотивации при изменении CloseReason, вероятно, также поможет.

CloseReason msdn для справки http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx