En MSDN descubrí CloseReason.UserClosing
que el usuario había decidido cerrar el formulario, pero supongo que es lo mismo para hacer clic en el botón X o hacer clic en el botón cerrar. Entonces, ¿cómo puedo diferenciar entre estos dos en mi código?
Gracias a todos.
Respuestas:
Suponiendo que solicita WinForms, puede usar el evento FormClosing () . El evento FormClosing () se activa cada vez que se va a cerrar un formulario.
Para detectar si el usuario hizo clic en X o en su CloseButton, puede obtenerlo a través del objeto del remitente. Intente convertir el remitente como un control de botón, y verifique tal vez por su nombre "CloseButton", por ejemplo.
De lo contrario, nunca he necesitado diferenciar si se hizo clic en X o CloseButton, ya que quería realizar algo específico en el evento FormClosing, como cerrar todos los MdiChildren antes de cerrar MDIContainerForm, o verificar el evento para detectar cambios no guardados. En estas circunstancias, no necesitamos, según yo, diferenciarnos de ninguno de los dos botones.
Cerrar con ALT+ F4también activará el evento FormClosing (), ya que envía un mensaje al formulario que dice que se cierre. Puede cancelar el evento configurando el
En nuestro ejemplo, esto se traduciría en
Observe la diferencia entre los eventos FormClosing () y FormClosed () .
FormClosing ocurre cuando el formulario recibió el mensaje para ser cerrado y verifica si tiene algo que hacer antes de que se cierre.
FormClosed ocurre cuando el formulario está realmente cerrado, es decir, después de que se cierra.
¿Esto ayuda?
fuente
La
CloseReason
enumeración que encontró en MSDN es solo con el propósito de verificar si el usuario cerró la aplicación, o fue debido a un apagado, o cerrada por el administrador de tareas, etc.Puedes realizar diferentes acciones, según el motivo, como:
Pero como habrás adivinado, no hay diferencia entre hacer clic en el botón x, o hacer clic con el botón derecho en la barra de tareas y hacer clic en "cerrar", o presionar Alt F4, etc. Todo termina en una
CloseReason.UserClosing
razón.fuente
El botón "X" se registra como
DialogResult.Cancel
tal otra opción es evaluar elDialogResult
.Si tiene varios botones en su formulario, probablemente ya esté asociando diferentes correos electrónicos
DialogResult
a cada uno y esto le proporcionará los medios para distinguir la diferencia entre cada botón.(Ejemplo:
btnSubmit.DialogResult = DialogResult.OK
,btnClose.DialogResult = Dialogresult.Abort
)fuente
DialogResult
permaneceNone
. ¿Cual podría ser el problema?X
haceDialogResult
contenerCancel
, noNone
. AsignarNone
a su botón es lo mismo que no establecer su.DialogResult
propiedad en absoluto, y si llamaform.Close()
desde el controlador de eventos de su botón,form.DialogResult
contendráCancel
. Solo asignar un valor que no seaNone
oaCancel
todos los botones de cierre de formulario le permitirá hacer la distinción deseada.¿Cómo detectar si el formulario se cerró haciendo clic en el botón X o llamando
Close()
al código?No puede confiar en el motivo cercano de los argumentos del evento de cierre del formulario, porque si el usuario hace clic en el botón X en la barra de título o cierra el formulario usando Alt + F4 o usa el menú del sistema para cerrar el formulario o el formulario se cierra llamando al
Close()
método, todo casos anteriores, el motivo de cierre será cerrado por el usuario que no es el resultado deseado.Para distinguir si el formulario se cerró con el botón X o con el
Close
método, puede utilizar cualquiera de las siguientes opciones:WM_SYSCOMMAND
verifiqueSC_CLOSE
y coloque una bandera.StackTrace
si alguno de los marcos contiene unaClose
llamada al método.Ejemplo 1 - Mango
WM_SYSCOMMAND
Ejemplo 2: comprobación de StackTrace
fuente
Determina cuándo cerrar la solicitud si se cierra un formulario (si su solicitud no está adjunta a un formulario específico).
fuente
Siempre uso un método de cierre de formulario en mis aplicaciones que detecta alt + x desde mi botón de salida, alt + f4 o se inició otro evento de cierre de formulario. Todas mis clases tienen el nombre de clase definido como cadena privada
mstrClsTitle = "grmRexcel"
en este caso, un método de salida que llama al método de cierre de formulario y un método de cierre de formulario. También tengo una declaración para el método de cierre de formulario -this.FormClosing = My Form Closing Form Closing method name
.El código para esto:
fuente
Puede intentar agregar un controlador de eventos desde el diseño de esta manera: Abra el formulario en la vista de diseño, abra la ventana de propiedades o presione F4, haga clic en el botón de la barra de herramientas de eventos para ver los eventos en el objeto Form, busque el evento FormClosing en el grupo Behavior y haga doble clic en él. Referencia: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral
fuente
si la condición se ejecutará cuando el usuario haga clic en 'X' o en el botón cerrar en el formulario. El else se puede usar cuando el usuario hace clic en Alt + f4 para cualquier otro propósito
fuente
fuente
Estoy de acuerdo con la
DialogResult
-Solution como la más sencilla.Sin embargo, en VB.NET, se requiere encasillado para obtener la
CloseReason
propiedad -Propertyfuente
También tuve que registrar la función de cierre dentro del método "InitializeComponent ()" del formulario:
Mi función "FormClosing" es similar a la respuesta dada ( https://stackoverflow.com/a/2683846/3323790 ):
Una cosa más para mencionar: también hay una función "FormClosed" que ocurre después de "FormClosing". Para utilizar esta función, regístrela como se muestra a continuación:
fuente
He hecho algo como esto.
fuente