2012-01-05 41 views
11

Tengo un WinForm que creo que muestra un mensaje con un botón. Esta es una vista de WinForm personalizada, ya que un cuadro de diálogo de mensaje de diálogo no era suficiente.Detectar cuando un formulario se ha cerrado C#

Tengo un trabajador en segundo plano iniciado y en ejecución. También quiero salir del ciclo while (aBackgroundWorker.IsBusy) si se hizo clic en el botón de myForm.

//MyProgram.cs 

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

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

En este momento, en el CustomForm caso Button_clicked, tengo

//CustomForm.cs 

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

¿Es necesario añadir más código a la clase CustomForm, o la ubicación en la que declarar e inicializar el formulario con el fin para poder detectar un cierre?

+0

¿Qué forma/clase quiere usted para notificar al cierre de la ventana? – Decker97

+1

Escribir este código no tiene sentido. Es de suponer que hay algo * después de * este ciclo. Mueva ese código al controlador de eventos RunWorkerCompleted para ese BGW. –

Respuesta

21

para detectar cuando la forma es en realidad cerrado, es necesario conectar el evento FormClosed:

this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 

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

alternativa:

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

void MyForm_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    // Do something 
} 
+0

salvó mi día ... gracias por la fantástica respuesta – MBH

+0

Otra referencia que me ayudó un poco a entender: http://www.dreamincode.net/forums/topic/185541-trigger-event-in-another-form/ 'vacío privado button1_Click (remitente del objeto, EventArgs e) { Form2 form2 = new Form2(); form2.FormClosed + = new FormClosedEventHandler (form2_FormClosed); form2.Show(); } void form2_FormClosed (remitente del objeto, FormClosedEventArgs e) { MessageBox.Show ("Formulario 2 cerrado"); } ' –

0

Gestione el evento FormClosing del formulario que se le notificará cuando se cierre el formulario, para que pueda realizar cualquier limpieza.

+0

El formulario es una forma general utilizada en toda mi aplicación, por lo que no puedo decir en CustomForm.cs OnFormClosing - limpiar esta parte específica de MyProgram.cs – jkh

+0

Puede necesitar hacerlo en todas las formas si la limpieza es específica del formulario. – Kekoa

0

Un par de cosas ...

En primer lugar, Parece que el bucle está ahí para evitar que la ejecución de la forma avance mientras el diálogo está abierto. Si ese es el caso, cámbiale .Show(parent) a .ShowDialog(parent). Eso también se encargará del resto de tu pregunta.

1

Asegúrate de que tu trabajador de fondo admite la cancelación y, como otros han señalado, utiliza el controlador de evento de formulario cerrado. Este código debe apuntarle en la dirección correcta:

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

Puede que se esté excediendo. Para mostrar un formulario como una ventana de diálogo y esperar a que salga antes de devolver el control al formulario de llamada, simplemente use:

mySubForm.ShowDialog();

Esto "bloqueará" el formulario principal hasta que el niño esté cerrado.

+0

Esto mantiene la IU iluminada y simplifica la lectura y la intención de clarificación. Sin olores –

0

Tenga en cuenta que this.Hide(); no es lo mismo que this.Close(); en el diálogo real su anulando el evento cerrado

Cuestiones relacionadas