2010-05-10 11 views
7

Questa deve essere una domanda stupida, ma non riesco a capirlo. Inoltre non posso usare il designer perché i programmatori prima di me sono riusciti a gettare GUI e logica tutto in uno, quindi ora è confuso. Devo farlo alla vecchia maniera.Windows Form Windows - intercettazione dell'evento Close X

Ho un modulo che può essere chiuso in 3 modi: pulsante Chiudi, menu File/Chiudi e l'icona X. Voglio che tutti facciano la stessa cosa. Intercettare il pulsante e gli eventi del menu è facile. In effetti, entrambi sono collegati a un metodo onCloseConfig. A proposito, c'è un nome migliore per questo metodo?

private void onCloseConfig(object sender, System.EventArgs e) 
{ 
    if (! m_configControl.Modified) 
    { 
     Application.Exit(); // Or should it be this.Close(); 
    } 
    .... 
    // Else present a dialog, ask if they want to save. 
} 

Così, per intercettare il X ho provato: this.FormClosing +=new FormClosingEventHandler(this.onCloseConfig); Credo che questo è ciò che causa un ciclo infinito. Non voglio che :) FormClosed è un'altra opzione, ma sembra troppo tardi. Voglio solo intercettare il fatto che la X è stata cliccata, non il fatto che il modulo si sta chiudendo.

risposta

12

Penso che si desideri chiudere il modulo, la cosa che potrebbe mancare è controllare il motivo della chiusura e annullarla solo se proviene dall'utente, ad es.

private void my_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
    e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that. 
    } 
} 

per nascondere la 'X' impostato Form.ControlBox = false, ma questo sarà sbarazzarsi di min/max pure.

+0

Cool! C'è un modo per nascondere X completamente? –

+0

Non senza rotolare la propria finestra cromata. – Nate

+1

puoi sbarazzarti del min max e chiudere anche se –

0

Questo dovrebbe smettere di finestra dalla chiusura: FormClosing (object sender, System.EventArts e) { se (e.CloseReason == CloseReason.UserClosing) e.Cancel = true; }

+1

System.EventArts [sic] o EventArgs non hanno un membro CloseReason, è necessario FormClosingEventArgs come nella mia risposta –

1

Btw, c'è un nome migliore per questo metodo ?

Chiudere [NomeFormazione] potrebbe essere una scelta migliore.

Oppure dovrebbe essere this.Close();

Sì, se tutto ciò che si desidera è chiudere il modulo.

È necessario creare un nuovo gestore di eventi per l'evento FormClosing. Include FormClosingEventArgs e non EventArgs come parametro. Nei gestori di clic del pulsante e della voce di menu, fai un this.Close().

Questo chiamerà l'evento e puoi posizionare tutti gli assegni lì.

3

Creare un metodo separato per il pulsante/menu Chiudi:

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

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

private void myForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (m_configControl.Modified) 
    { 
     var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel); 
     if(result == DialogResult.Yes) 
      //Save here 
     else if(result == DialogResult.Cancel) 
      e.Cancel = true; 
    } 
} 

In alternativa, è possibile disattivare il primo tasto ("X") del tutto impostando this.ControlBox = false

+0

+1 Per creare un metodo separato ed una risposta esplicita. =) –

1

Il FormClosed event si verifica una volta la forma è chiuso. Questo non è sicuramente quello che vuoi.

Il FormClosing event è più probabilmente quello che ti serve.

L'evento FormClosing viene attivato indipendentemente dal pulsante o dal collegamento di menu selezionato. Tutto ciò che tenta di chiudere il modulo attiverà l'evento FormClosing.

Ora, il modo più opportuno utilizzare il FormClosingEventArgs sarebbe la seguente all'interno del vostro FormClosing metodo del gestore dell'evento:

if(m_configControl.Modified) 
    e.Cancel = true; 

quindi a meno che il controllo di configurazione viene modificato, la forma manterrà chiusura. Si desidera impedire che si chiuda solo se sono presenti modifiche o modifiche non salvate.

EDIT 2 dopo aver riletto la tua domanda, vedi sotto le mie modifiche al codice superiore:

if(m_configControl.Modified) 
    if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected") 
     SaveChanges(); 

Questo sarà quindi richiedere all'utente di modifiche non salvate e salvare solo se l'utente fa clic su OK nella MessageBox. Nota che dovrai aggiungere i pulsanti di conseguenza nei parametri aggiuntivi del metodo MessageBox.Show().

Se si vuole realizzare un Sì/No/Annulla su FormClosing, allora si dovrà andare in questo modo:

if(m_configControl.Modified) { 
    DialogResult dr = MessageBox.Show(...); 
    switch(dr) { 
     case DialogResult.OK: 
      SaveChanges(); 
      break; 
     case DialogResult.No: 
      // Do nothing... 
      break; 
     case DialogResult.Cancel: 
      e.Cancel = true; 
    } 
} 

Così, quando l'utente fa clic su Sì, l'applicazione salvare le modifiche. Quando fa clic su No, l'applicazione non farà nulla al riguardo e continuerà la sua chiusura. Quando l'utente desidera tornare all'applicazione, verrà impedito Chiudere.

MODIFICA 1 Dai un'occhiata alla mia risposta allo This Question che sembra proprio quello che vuoi ottenere.