Определить, когда форма была закрыта c # - PullRequest
12 голосов
/ 06 января 2012

У меня есть 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 или место, где я объявляю и инициализирую форму, чтобы можно было обнаружить замыкание?

Ответы [ 7 ]

23 голосов
/ 06 января 2012

Чтобы определить, когда форма действительно закрыта, вам нужно перехватить событие 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
}
5 голосов
/ 06 января 2012

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

mySubForm.ShowDialog ();

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

0 голосов
/ 10 апреля 2017

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

0 голосов
/ 06 января 2012

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

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();
}
0 голосов
/ 06 января 2012

Пара вещей ...

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

0 голосов
/ 06 января 2012

Вы должны иметь возможность подключиться к событиям FormClosing и FormClosed.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosed.aspx

Закрытие происходит до его закрытияЗакрыто - после того, как закрыто.

0 голосов
/ 06 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...