Подтвердить что ты не робот

"e.Cancel" в событии FormClosing

При использовании события FormClosing, почему работает код e.Cancel = true;, но new CancelEventArgs().Cancel = true; не работает?

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;

    new CancelEventArgs().Cancel = true;
}
4b9b3361

Ответ 1

Событие поднимается кодом сантехники Winforms. Единственный способ увидеть, что пользовательский обработчик событий хочет изменить поведение по умолчанию, - это объект e. Создание нового объекта CancelEventArgs не имеет побочных эффектов, которые может обнаружить сантехника.

Там что-то еще не так, события поднимаются в пользу внешнего кода, позволяя ему знать, что происходит, и давая ему возможность изменить поведение. Здесь нет внешнего кода, обработчик событий фактически является частью того же класса, который вызывает событие. Другими словами, форма слушает собственные события. Там гораздо лучший способ справиться с этим, вы переопределите метод, который вызывает событие. Вот так:

    protected override void OnFormClosing(FormClosingEventArgs e) {
        e.Cancel = true;
        base.OnFormClosing(e);
    }

Теперь внешний код может переопределять поведение по умолчанию, события возникают после запуска метода OnXxxx. И у вас есть выбор, если вы не хотите, чтобы внешний код переопределял поведение, просто замените два оператора.

Ответ 2

Что вы ожидаете new CancelEventArgs().Cancel = true;, за которым следует закрывающая скобка? Вы создаете новый экземпляр класса CancelEventArgs, устанавливая для него значение, а затем просто отбрасываете результат всей этой тяжелой работы.

Эта строка кода, скорее всего, работает точно так, как предполагается.

Ответ 3

Этот код, безусловно, работает, просто проверьте его

protected override void OnFormClosing(FormClosingEventArgs e)
        {            
            base.OnFormClosing(e);
            if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes)
            {
                Dispose(true);
                Application.Exit();
            }
            else
            {
                e.Cancel = true;
            }
        }

        private DialogResult PreClosingConfirmation()
        {
            DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?          ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            return res;
        }

Счастливое кодирование

Ответ 4

Это потому, что CancelEventArgs - это ссылка на объект, переданная обработчику события в вашем коде. Код за кулисами вызывает FormClosing с объектом CancelEventArgs, и все обработчики событий получают тот же самый объект. После того, как все обработчики имели свою очередь, код за кулисами проверяет отправленный объект CancelEventArgs, чтобы узнать, установлено ли его свойство Cancel на true. Если это так, это ничего не делает, и цепочка событий FormClose прекращается. Если Cancel равно false (CancelEventArgs значение по умолчанию), то есть он не был установлен в Cancel цепочку событий, код за кулисами продолжается, а затем вызывает событие FormClosed.

Вы можете прочитать больше на Событие Form.FormClosing в MSDN.

В Forms за всеми событиями-события обычно следует событие -ed. События-события обычно имеют CancelEventArgs, которые могут иметь свойство Cancel, установленное на true, чтобы остановить событие -ed.