J'ai un WinForm que je crée qui montre une invite avec un bouton. Il s'agit d'une vue WinForm personnalisée, car une boîte de dialogue de message n'était pas suffisante.
J'ai un travailleur de fond a commencé et en cours d'exécution. Je souhaite également quitter la boucle while (aBackgroundWorker.IsBusy
) si le bouton sur myForm a été cliqué.
//MyProgram.cs
using(CustomForm myForm = new CustomForm())
{
myForm.Show(theFormOwner);
myForm.Refresh();
while(aBackgroundWorker.IsBusy)
{
Thread.Sleep(1);
Application.DoEvents();
}
}
À l'heure actuelle, dans l'événement CustomForm
l'événement Button_clicked
, j'ai
//CustomForm.cs
private void theButton_Click(object sender, EventArgs e)
{
this.Close();
}
Dois-je ajouter plus de code à la classe CustomForm ou à l'emplacement où je déclare et initialise le formulaire pour pouvoir détecter une fermeture?
Pour détecter le moment où le formulaire est réellement fermé, vous devez accrocher l'événement FormClosed:
this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
// Do something
}
Alternativement:
using(CustomForm myForm = new CustomForm())
{
myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed);
...
}
void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
// Do something
}
Vous pourriez être exagéré. Pour afficher un formulaire comme une fenêtre de dialogue et attendre sa fermeture avant de retourner le contrôle au formulaire appelant, utilisez simplement:
mySubForm.ShowDialog ();
Cela "bloquera" le formulaire principal jusqu'à ce que l'enfant soit fermé.
Traitez l'événement FormClosing du formulaire à notifier lors de la fermeture du formulaire pour pouvoir effectuer un nettoyage quelconque.
Vous devriez pouvoir accéder aux événements FormClosing et FormClosed.
http://msdn.Microsoft.com/en-us/library/system.windows.form.form.formclosing.aspx http://msdn.Microsoft.com/en-us/ bibliothèque/system.windows.forms.form.formclosed.aspx
La fermeture est avant sa fermeture. Fermé après sa fermeture.
Un couple de choses ...
Tout d'abord, il semble que la boucle existe afin d'empêcher l'exécution d'une forme alors que la boîte de dialogue est ouverte. Si tel est le cas, remplacez .Show(parent)
par .ShowDialog(parent)
. Cela répondra également au reste de votre question.
Assurez-vous que votre arrière-plan prend en charge l'annulation et, comme d'autres l'ont souligné, utilisez le gestionnaire d'événements de formulaire fermé. Ce code devrait vous orienter dans la bonne direction:
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();
}
Notez que this.Hide();
n’est pas la même chose que this.Close();
dans la boîte de dialogue réelle, ce qui annule l’événement fermé.