2011-02-28 26 views
11

Al utilizar el evento FormClosing, ¿por qué funciona el código e.Cancel = true;, pero new CancelEventArgs().Cancel = true; no funciona?"e.Cancelar" en cierre de formulario Evento

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 

    new CancelEventArgs().Cancel = true; 
} 
+4

Porque una es la manera correcta de cancelar un evento de cierre de formulario, y la otra es basura total. – Jamiec

+14

@Jamiec: "Total de basura" no es muy descriptivo y, por lo tanto, no es muy útil. Sin una comprensión de la instanciación de objetos, es muy fácil ver cómo se puede confundir aquí. Estoy de acuerdo en que la explicación es simple, pero no es tan simple como "basura total". –

Respuesta

20

El evento es provocado por el código de plomería de Winforms. La única forma en que puede ver que el controlador de eventos personalizado desea alterar el comportamiento predeterminado es a través del objeto e. Crear un nuevo objeto CancelEventArgs no tiene efectos secundarios que la plomería pueda detectar.

Hay algo más erróneo, los eventos se generan para el beneficio del código externo, lo que le permite saber qué está pasando y le da una opción para modificar el comportamiento. No hay código externo aquí, el controlador de eventos es en realidad parte de la misma clase que plantea el evento. En otras palabras, la forma es escuchar sus propios eventos. Hay una manera mucho mejor de lidiar con eso, usted anula el método que plantea el evento. De esta manera:

protected override void OnFormClosing(FormClosingEventArgs e) { 
     e.Cancel = true; 
     base.OnFormClosing(e); 
    } 

código Ahora externa puede anular el comportamiento por defecto, los eventos se elevó después el método OnXxxx corre. Y tiene una opción, si no desea que el código externo anule el comportamiento, simplemente cambie las dos declaraciones.

15

¿Qué esperas new CancelEventArgs().Cancel = true; seguido de una llave de cierre de hacer? Está creando una nueva instancia de la clase CancelEventArgs, estableciendo un valor en ella y luego descartando el resultado de todo ese trabajo.

Esa línea de código probablemente funciona exactamente como se supone que debe.

6

Este código de seguridad funcionan igual comprobar que

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; 
     } 

feliz Codificación

3

Es porque el CancelEventArgs es una referencia de objeto se pasa al controlador de eventos en el código. El código detrás de escena aumenta FormClosing con un objeto CancelEventArgs y todos los controladores de eventos reciben el mismo objeto. Una vez que todos los controladores han tenido su turno, el código detrás de escena comprueba el objeto CancelEventArgs que envió para ver si su propiedad Cancel está configurada en . Si es así, no hace nada, y la cadena de eventos FormClose se detiene. Si Cancel es false (CancelEventArgs valor predeterminado), lo que significa que no se ha establecido en Cancel la cadena de eventos, el código detrás de escena avanza, y luego aumenta el evento FormClosed.

Puede leer más en Form.FormClosing Event on MSDN.

En Forms todos los sucesos -ing generalmente son seguidos por un evento -ed. Los eventos -ing generalmente tienen CancelEventArgs, que pueden tener su propiedad Cancel establecida en true para detener el evento -ed.

Cuestiones relacionadas