c # Форма WinForms по-прежнему закрывается после установки e.Cancel = true в событии Form_FormClosing - PullRequest
5 голосов
/ 17 августа 2011

Это код вопроса:

    private void FormAccounting_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.FormAccountingLocation = this.Location;
        Properties.Settings.Default.Save();
        if (IsEditing)
        {
            MessageBox.Show("Please save or cancel open transactions before closing the accounting window.", "Open Transactions", MessageBoxButtons.OK, MessageBoxIcon.Information);
            e.Cancel = true;
        }
    }

Я добавил точки останова в строку e.Cancel = true;, чтобы убедиться, что она выполняется.

Форма закрывается сразу после нажатия Ok.

Вот код, который вызывает FormAccounting:

    private void buttonAccounts_Click(object sender, EventArgs e)
    {
        FormAccounting NewFormAccounting = new FormAccounting();
        NewFormAccounting.Show();
    }

1 Ответ

13 голосов
/ 17 августа 2011

Отмена события закрытия формы работает для предотвращения:

  1. Пользователь закрывает форму
  2. Приложение. Выход из приложения
  3. Код от звонка в форму. Закрыть на форму

Но это не помогает предотвратить:

  1. Пользователь закрывает основную форму приложения
  2. Код вызова формы. Укажите на форме
  3. Код вызова формы. Закрыть в главном окне приложения

Последние 3 случая даже не вызывают событие закрытия формы на неосновной форме, поэтому форма исчезает без возможности ее отмены. Возможно, ваше приложение заставляет форму сначала закрыться одним из первых трех способов, который вызывает событие, а затем одним из вторых трех способов (или чем-то похожим), который не вызывает событие и принудительно закрывает форму в любом случае. .

Edit: Добавьте эту функцию в код вашей формы, и она позволит вам просмотреть в отладчике, как выглядит стек вызовов, когда ваше окно закрывается, чтобы вы могли увидеть, что на самом деле вызывает его:

  protected override void DestroyHandle()
  {
     System.Diagnostics.Debugger.Break();
     base.DestroyHandle();
  }
...