working not close application .net winforms shutdown application-shutdown

.net - not - Indicar al usuario que guarde al cerrar la aplicación



c# close application programmatically (5)

Creo que TaskManagerClosing debería ser la única razón por la que no se solicite, si corresponde. Personalmente, me gustaría que se me solicite en el caso de WindowsShutDown . Si cierro Windows con un documento no guardado en alguna parte, significa que me he olvidado de él.

Estoy escribiendo lo que se reduce a un editor de documentos. Cuando la aplicación se está cerrando, necesito pedirle al usuario que guarde los cambios. Esto es bastante fácil. Mi pregunta es cuándo es apropiado no avisar al usuario, y en su lugar simplemente descartar datos no guardados y cerrar.

En el evento FormClosing, la enumeración CloseReason incluye:

  • Ninguna
  • WindowsShutDown
  • MdiFormClosing
  • UserClosing
  • TaskManagerClosing
  • FormOwnerClosing
  • SolicitudExitCall

Me imagino que WindowsShutDown y TaskManagerClosing no deberían causar un "¿guardar cambios?" solicite que aparezca, para evitar que la aplicación se cuelgue con el mensaje que se muestra.

¿Es esta práctica estándar, o debería estar haciendo algo más aquí?

Para mayor claridad, aquí está el código:

protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); if (!(e.CloseReason == CloseReason.WindowsShutDown || e.CloseReason == CloseReason.TaskManagerClosing) && this.ChangesPending()) { switch (MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel)) { case DialogResult.Yes: this.Save(); break; case DialogResult.No: // Do nothing break; case DialogResult.Cancel: e.Cancel = true; break; } } }


Creo que incluso TaskManagerClosing podría usar un aviso para guardar. Si su aplicación está respondiendo normalmente, cerrarla a través del administrador de tareas no debería ser diferente de cualquier otra forma de cerrarla. Si se cuelga, no importa lo que haga su controlador onClose, nunca llegará.

Estoy de acuerdo con @Jerry, en cuanto a que es más importante evitar las indicaciones para guardar si los datos no han cambiado desde el último guardado. Por lo general, utilizo un simple indicador "modificado", que se establece en cualquier acción de edición, y se borra en las tareas de guardar y cargar.


Definitivamente también mostraría el cuadro de diálogo "¿Quieres guardar?" En WindowsShutDown (la aplicación podría haber estado en segundo plano por un tiempo y el usuario se olvidó de ella, o podría haber hecho clic en "Reiniciar" después de un service pack fue instalado sin pensarlo dos veces, etc.).

En cuanto a TaskManagerClosing, no mostraría el diálogo en este caso.


Personalmente prefiero cerrar el programa cuando el usuario selecciona cerrar, si hay documentos no guardados en el momento oportuno, prefiero mantener copias de seguridad de esos archivos e informar al usuario que hay documentos no guardados la próxima vez que abra la aplicación.

Lo hago por un par de razones, la número uno me gusta que cierren mis aplicaciones cuando les digo que cierren, y la número dos guardando una copia temporal del archivo que actualizo con todos los cambios a medida que el usuario trabaja en él. contra bloqueos inesperados y cierres de mis aplicaciones.

Entonces, con esta técnica no tiene que preocuparse porque la aplicación se haya cerrado.


Realmente, el CloseReason es un punto discutible, ¿no? El hecho de que tu formulario se está yendo es lo que intentas atrapar.

Ahora necesita saber si su aplicación ya ha manejado el evento "guardar". Si es así, la forma puede desaparecer. Has guardado tu documento. Pero si no, es posible que desee solicitar al usuario.

Si puede validar los datos rápidamente (es decir, hacer una comparación de cadenas o hash en el documento en comparación con los datos en el archivo), sabrá si el usuario ha guardado los datos del formulario.

De lo contrario, si hay muchos campos y comprobar que cada uno es de recursos prohibitivos, coloque un indicador "isDirty" en su formulario. Deje que el método Save () establezca isDirty en falso, y cada cambio de campo lo establece en verdadero.

Luego, en formClosing, todo lo que necesitas es:

protected override void OnFormClosing(FormClosingEventArgs e) { if (isDirty) { DialogResult R = MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel); if (R == DialogResult.Yes) { this.Save(); } else if (R == DialogResult.Cancel) { e.Cancel = true; } } }