web-dev-qa-db-fra.com

Détecter lorsqu'un formulaire a été fermé c #

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?

12
jkh

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
}
22
competent_tech

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é.

5
Dracorat

Traitez l'événement FormClosing du formulaire à notifier lors de la fermeture du formulaire pour pouvoir effectuer un nettoyage quelconque.

0
Kekoa

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.

0
user1231231412

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.

0
Sam Axe

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();
}
0
evasilchenko

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é.

0
dcarl661