Определить, когда форма закрыта С#

У меня есть WinForm, который я создаю, который показывает подсказку с помощью кнопки. Это пользовательское представление WinForm, поскольку диалоговое окно с сообщением недостаточно.

У меня работает и работает фоновый рабочий стол. Я также хочу выйти из цикла while (aBackgroundWorker.IsBusy), если была нажата кнопка на myForm.

//MyProgram.cs

using(CustomForm myForm = new CustomForm())
{
    myForm.Show(theFormOwner);
    myForm.Refresh();

    while(aBackgroundWorker.IsBusy)
    {
        Thread.Sleep(1);
        Application.DoEvents();
    }
}

Прямо сейчас, в событии CustomForm Button_clicked у меня есть

//CustomForm.cs

private void theButton_Click(object sender, EventArgs e)
{
  this.Close();
}

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

Ответ 1

Чтобы определить, когда форма фактически закрыта, вам нужно подключить событие FormClosed:

    this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);

    void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Do something
    }

В качестве альтернативы:

using(CustomForm myForm = new CustomForm())
{
    myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed);
    ...
}

void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
    // Do something
}

Ответ 2

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

mySubForm.ShowDialog();

Это будет "блокировать" основную форму, пока ребенок не будет закрыт.

Ответ 3

Убедитесь, что ваш фоновый рабочий поддерживает отмену, и, как указывали другие, используйте обработчик обработчика формы. Этот код должен указывать вам в правильном направлении:

using(CustomForm myForm = new CustomForm())
{
  myForm.FormClosed += new FormClosedEventHandler(ChildFormClosed);
  myForm.Show(theFormOwner);
  myForm.Refresh();


  while(aBackgroundWorker.IsBusy)
  {
    Thread.Sleep(1);
    Application.DoEvents();
  }
}

void ChildFormClosed(object sender, FormClosedEventArgs e)
{
    aBackgroundWorker.CancelAsync();
}

Ответ 4

Обрабатывать FormClosing событие формы, которое должно быть уведомлено, когда форма закрывается, поэтому вы можете выполнить любую очистку.

Ответ 6

Несколько вещей...

Во-первых, кажется, что цикл существует, чтобы предотвратить выполнение формы выполнения, пока диалог открыт. Если это так, измените значение .Show(parent) на .ShowDialog(parent). Это также позаботится об остальной части вашего вопроса.

Ответ 7

Обратите внимание, что this.Hide(); не совпадает с this.Close(); в фактическом диалоговом окне, где вы переопределяете закрытое событие