Определить, когда форма закрыта С#
У меня есть 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 событие формы, которое должно быть уведомлено, когда форма закрывается, поэтому вы можете выполнить любую очистку.
Ответ 5
Вы должны иметь возможность подключаться к событиям 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
Закрытие перед закрытием.
Закрыто после закрытия.
Ответ 6
Несколько вещей...
Во-первых, кажется, что цикл существует, чтобы предотвратить выполнение формы выполнения, пока диалог открыт. Если это так, измените значение .Show(parent)
на .ShowDialog(parent)
. Это также позаботится об остальной части вашего вопроса.
Ответ 7
Обратите внимание, что this.Hide();
не совпадает с this.Close();
в фактическом диалоговом окне, где вы переопределяете закрытое событие