web-dev-qa-db-de.com

Erkennen, wenn ein Formular geschlossen wurde c #

Ich habe eine WinForm, die ich erstelle, die eine Eingabeaufforderung mit einer Schaltfläche anzeigt. Dies ist eine benutzerdefinierte WinForm-Ansicht, da ein Meldungsfelddialog nicht ausreichend war.

Ich habe einen Hintergrundarbeiter, der gestartet ist und läuft. Ich möchte auch die while (aBackgroundWorker.IsBusy) -Schleife beenden, wenn auf die Schaltfläche in myForm geklickt wurde. 

//MyProgram.cs

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

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

Im Moment habe ich in der CustomForm dem Button_clicked-Ereignis 

//CustomForm.cs

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

Muss ich der CustomForm-Klasse mehr Code hinzufügen oder den Ort, an dem ich das Formular deklariere und initialisiere, um eine Schließung erkennen zu können?

12
jkh

Um festzustellen, wann das Formular tatsächlich geschlossen ist, müssen Sie das FormClosed-Ereignis einhaken:

    this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);

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

Alternative:

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

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

Sie könnten übertrieben sein. Um ein Formular wie ein Dialogfenster anzuzeigen und zu warten, bis es beendet ist, bevor Sie die Kontrolle wieder an das aufrufende Formular zurückgeben, verwenden Sie einfach:

mySubForm.ShowDialog ();

Dadurch wird das Hauptformular "blockiert", bis das Kind geschlossen wird.

5
Dracorat

Behandeln Sie das FormClosing -Ereignis des Formulars, das beim Schließen des Formulars benachrichtigt werden soll, damit Sie eine Bereinigung durchführen können.

0
Kekoa

Sie sollten in der Lage sein, die Ereignisse FormClosing und FormClosed einzuhaken.

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

Schließen ist, bevor es geschlossen wird. Geschlossen ist, nachdem es geschlossen wurde.

0
user1231231412

Ein paar Dinge ...

Zunächst scheint es, dass die Schleife vorhanden ist, um zu verhindern, dass die Ausführungsform ausgeführt wird, während der Dialog geöffnet ist. Wenn dies der Fall ist, ändern Sie .Show(parent) in .ShowDialog(parent). Das kümmert sich auch um den Rest Ihrer Frage.

0
Sam Axe

Vergewissern Sie sich, dass Ihr Hintergrundarbeiter die Stornierung unterstützt, und verwenden Sie, wie andere angegeben haben, den Formular-Handler für geschlossene Ereignisse. Dieser Code sollte Sie in die richtige Richtung weisen:

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

Beachten Sie, dass this.Hide(); nicht dasselbe ist wie this.Close(); im eigentlichen Dialogfeld, wenn Sie das geschlossene Ereignis überschreiben

0
dcarl661