2012-01-05 16 views
11

Ho un WinForm che creo che mostra un prompt con un pulsante. Questa è una vista WinForm personalizzata, poiché la finestra di dialogo della finestra di messaggio non era sufficiente.Rileva quando un modulo è stato chiuso C#

Ho un lavoratore in background avviato e in esecuzione. Voglio anche uscire dal ciclo while (aBackgroundWorker.IsBusy) se il pulsante su myForm è stato cliccato.

//MyProgram.cs 

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

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

In questo momento, in CustomForm caso Button_clicked, ho

//CustomForm.cs 

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

Devo aggiungere altro codice alla classe CustomForm, o la posizione in cui dichiaro e inizializzare il modulo per essere in grado di rilevare una chiusura?

+0

Quale forma/classe vuoi di notificare alla chiusura della finestra? – Decker97

+1

Scrivere questo codice non ha senso. Presumibilmente c'è qualcosa * dopo * questo ciclo while. Spostare quel codice sul gestore di eventi RunWorkerCompleted per tale BGW. –

risposta

21

per rilevare quando il modulo è in realtà chiuso, è necessario associare l'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

salvato la mia giornata..grazie per la fantastica risposta – MBH

+0

Altri riferimenti che mi hanno aiutato un po 'a capire: http://www.dreamincode.net/forums/topic/185541-trigger-event-in-another-form/ 'private void button1_Click (oggetto mittente, EventArgs e) { Form2 form2 = new Form2(); form2.FormClosed + = new FormClosedEventHandler (form2_FormClosed); form2.Show(); } void form2_FormClosed (oggetto mittente, FormClosedEventArgs e) { MessageBox.Show ("Modulo 2 chiuso!"); } ' –

0

Gestire l'evento FormClosing del modulo da notificare quando il modulo è in chiusura, in modo da poter eseguire qualsiasi pulizia.

+0

Il modulo è un modulo generale utilizzato in tutta la mia applicazione, quindi non posso dire in CustomForm.cs OnFormClosing - ripulire questa parte specifica di MyProgram.cs – jkh

+0

Potrebbe essere necessario farlo in tutti i moduli se la pulizia è specifica per il modulo. – Kekoa

0

Un paio di cose ...

In primo luogo, sembra che il ciclo sia lì per impedire che il modulo di esecuzione proceda mentre la finestra di dialogo è aperta. In tal caso, modificare .Show(parent) in .ShowDialog(parent). Questo si occuperà anche del resto della tua domanda.

1

Assicurarsi che il proprio assistente in background supporti l'annullamento e, come altri hanno sottolineato, utilizzare il gestore di eventi del modulo chiuso. Questo codice dovrebbe indirizzarti nella giusta direzione:

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

Potrebbe essere eccessivo. Per mostrare un modulo come una finestra di dialogo e attendere che esca prima di restituire il controllo al modulo di chiamata, utilizzare:

mySubForm.ShowDialog();

Questo "bloccherà" il modulo principale fino alla chiusura del bambino.

+0

Ciò mantiene l'illuminazione dell'interfaccia utente e semplifica l'intenzione di lettura e chiarificazione. Nessun odore. –

0

Nota che this.Hide(); non è lo stesso che this.Close(); nella finestra di dialogo effettivo tuo ignorando l'evento a porte chiuse

Problemi correlati