2011-12-03 11 views
7

El problema es que el cuadro de mensaje con "seguro que quieres cerrar?" aparece, pero cuando hago clic en "no", sigue procediendo a cerrar el programa. ¿Alguna sugerencia? Aquí está mi código:Pidiendo confirmación cuando se hace clic en el botón "X"

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     CloseCancel(); 
    } 

    public static void CloseCancel() 
    { 
     const string message = "Are you sure that you would like to cancel the installer?"; 
     const string caption = "Cancel Installer"; 
     var result = MessageBox.Show(message, caption, 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Question); 

     if (result == DialogResult.Yes) 
      Environment.Exit(0); 
    } 

Respuesta

20

Se espera para establecer la propiedad Cancel del argumento FormClosingEventArgs a true cuando se requiere la estrecha-operación que ser cancelado. Y un Environment.Exit(0) explícito es normalmente no requerido ya que el formulario está en camino de ser cerrado de cualquier manera (la cancelación del proceso de cierre es opt-in, no opt-out).

Reemplazar el último bit con:

var result = MessageBox.Show(message, caption, 
          MessageBoxButtons.YesNo, 
          MessageBoxIcon.Question); 

e.Cancel = (result == DialogResult.No); 
6

e.Cancel en el caso FormClosing se detendrá el proceso de cierre

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (CloseCancel()==false) 
     { 
      e.Cancel = true; 
     }; 
    } 

    public static bool CloseCancel() 
    { 
     const string message = "Are you sure that you would like to cancel the installer?"; 
     const string caption = "Cancel Installer"; 
     var result = MessageBox.Show(message, caption, 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Question); 

     if (result == DialogResult.Yes) 
      return true; 
     else 
      return false; 
    } 
1
protected Boolean CanClose(Boolean CanIt) 
{ 
    if(MessageBox.Show("Wanna close?", "Cancel Installer", MessageBoxButtons.YesNo,  MessageBoxIcon.Question).ShowDialog() == DialogResult.Yes) 
    { 
     // Yes, they want to close. 
     CanIt = true; 
    } 
    else 
    { 
    // No, they don't want to close. 
    CanIt = false; 
    } 

    return CanIt; 
} 

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if(CanClose(false) == true) 
    { 
     this.Dispose(true); 
    } 
    else 
    { 
     e.Cancel = true; 
    } 
} 

estoy seguro de cómo manejar el otro escenario usted mencionó (manejando el 'X' clic) Tal vez usted podría hacer algo como esto (pseudo-código):

// IF CLICKED YES 
    THEN CLOSE 
// ELSE-IF CLICKED NO 
    THEN DO NOTHING 
// ELSE 
    THEN DO NOTHING 
+0

Esto es, pero estás exagerando las cosas. ¿Por qué 'CanClose (false)' y no 'CanClose()'? – Otiel

+0

bien probado, no necesita un argumento en el método CanClose(), felicidades por la primera respuesta –

2

que acaba de tomar sencilla

protected override void OnFormClosing(FormClosingEventArgs e) 
     {    
      base.OnFormClosing(e); 
      if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes) 
      { 
       Dispose(true); 
       Application.Exit(); 
      } 
      else 
      { 
       e.Cancel = true; 
      } 
     } 

     private DialogResult PreClosingConfirmation() 
     { 
      DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?   ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
      return res; 
     } 
0

La pregunta ahora es viejo, pero de esta manera es más sencillo y corto, y yo creo que sí ser útil para los que llegan en esta página:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if (MessageBox.Show("Are you sure that you would like to cancel the installer?", "Cancel Installer", MessageBoxButtons.YesNo) == DialogResult.No) 
    { 
     e.Cancel = true; 
    } 
} 

y utilizar en otros lugares this.Close() en lugar de una función.

Cuestiones relacionadas