Foros del Web » Programación para mayores de 30 ;) » .NET »

Cerrar formulario y confirmar cierre al presiona el boton X del form

Estas en el tema de Cerrar formulario y confirmar cierre al presiona el boton X del form en el foro de .NET en Foros del Web. Holas todos, tengo una duda nuevemnte haber si me pueden dar una mano con esto. Estoy trabajando con el Visual Studio 2008 y vb.net. Tengo ...
  #1 (permalink)  
Antiguo 10/12/2009, 08:43
 
Fecha de Ingreso: octubre-2009
Mensajes: 70
Antigüedad: 14 años, 6 meses
Puntos: 0
Pregunta Cerrar formulario y confirmar cierre al presiona el boton X del form

Holas todos, tengo una duda nuevemnte haber si me pueden dar una mano con esto.

Estoy trabajando con el Visual Studio 2008 y vb.net.
Tengo un formulario que me gustaria al apretar el boton X del form (ese que esta en la esquina superior derecha, de todos los forms), se preguntara si se desea guardar los cambios hechos en el mismo formulario, entonces guardaria los cambios y se cerraria dicho form.

El punto es que busque en san google, y encontre un evento asociado al cierre del form el "closing" o algo asi ,esto me servía, pero despues me di cuenta que cuando apretaba el boton guardar (que lo agrege yo), este boton registra los datos del formulario y despues se cierra. Por lo tanto se activava el evento closing al cerrar el formulario y no es precisamente lo que quiero, solo se deberia cerrar el form.
Solo necesito que se pregunte si desea guardar los cambios al apretar el boton "X" del form o al apretar el boton Cerrar(que lo agrege yo) y no en el boton Guardar.

Espero se alla entendido, sino pregunten nomas. XD
Eso seria muchas gracias de antemano
  #2 (permalink)  
Antiguo 10/12/2009, 10:02
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 14 años, 7 meses
Puntos: 16
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

Yo una vez estuve en una situación similar, por no decir idéntica. Aunque la solución que le di en ese momento no sé si sea la indicada funcionó sin problemas.
En el botón Guardar hacía algo así:
Código vb.net:
Ver original
  1. MetodoGuardarDatos()
  2. 'Acá cerraba el formulario con un Me.Close()
  3. 'Para que no afecte al evento Form_Closing uso el Dispose XD
  4. Me.Dispose() 'Destruye al formulario de la memoria, obviamente cerrándolo.

Luego en el evento Form_Closing usando la propiedad CloseReason hago lo sgte:
Código vb.net:
Ver original
  1. If e.CloseReason = CloseReason.UserClosing Then
  2.          MessageBox.Show("¿Desea guardar los cambios?")
  3. End If
Con esto mostrarás ese mensaje cuando el usuario haga click en la X del form o se llame al método Close()

Cuando implementé esta "solución" -que no me gusta mucho- era mucho más novato de lo que soy ahora, supongo que alguien podrá encontrar una solución más "limpia" por así decirlo.

Espero te sirva
__________________
Eduardo Peredo
Wigoin
  #3 (permalink)  
Antiguo 10/12/2009, 12:02
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

la solucion de eduardo es una opcion practica y simple la otra opcion seria usar el sender de tu evento form closing y averiguar que boton envio el cerrar.

if(((Control)sender).Id.ToString().Equals("botonGu ardar"))
cerrar sin notificar
else
notificar
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #4 (permalink)  
Antiguo 10/12/2009, 16:03
Avatar de eledgarr  
Fecha de Ingreso: octubre-2008
Ubicación: La ciudad de la esperanza
Mensajes: 133
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

¿Y si aprietan alt+f4 o algun atajo que tengas y no se guardaron los cambios?

Por mi experiencia te digo que no hay mas debe ser por el evento FormClosing, si no te la vas a pasar poniendo parches por cada excepción que tengas y vas a acabar con cientos de lineas de codigo por cada pantalla, te platico como lo solucione, tengo una bandera que llamare aqui transacción que puede tomar estos valores

0:ninguna
1: alta
2: baja
3:cambio

en el evento FormClosing disparo un proceso que verifica si transaccion es mayor a cero entonces se debe hacer algo antes de cerrar, si es asi entonces realiza la transaccion.

Al abrir la ventana transaccion vale cero, cuando se aprietan los botones de alta, baja o cambio transaccion toma su valor correspondiente, igual si se detecta algun cambio en los controles detecta que hay un cambio.

Espero explicarme perdona por no ponerte codigo, pero asi es la idea, puede ser largo el analisis y diseño pero neto que a la larga vale la pena.



Perdon falto comentar es verdad que e.CloseReason te puede detectar cuando se aprieta Alt+F4 y 7 psobilidades más por las que se cierra tu ventana,es más CloseReason.None te puede atrapar practicamente cualquier excepción, pero te repito por mi caso y mi experiencia recomiendo más lo anterior además que en ese proceso que te menciono tambien aprovecho para mandar a validar los cambios, digo no es la neta y las dos personas que te contestaron tienen mucho más conocimiento y experiencia que yo, pero eso es lo que me paso ami
__________________
Si te sirve lo que te escribo regalame un karma positivo
-----------------------------------------------------------------------
Estoy aqui no por que conozco mucho, estoy para ignorar menos

Última edición por eledgarr; 10/12/2009 a las 16:15 Razón: falto comentar algo
  #5 (permalink)  
Antiguo 10/12/2009, 16:12
Avatar de eperedo  
Fecha de Ingreso: septiembre-2009
Ubicación: Perú
Mensajes: 654
Antigüedad: 14 años, 7 meses
Puntos: 16
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

Claro, depende de que tanto pueda modificarse el escenario a futuro.
Cita:
¿Y si aprietan alt+f4 o algun atajo que tengas y no se guardaron los cambios?
Si presionan alt+f4 quiere decir que se cierra el formulario por decisión del usuario, entonces según esto:
Código vb.net:
Ver original
  1. If e.CloseReason = CloseReason.UserClosing Then
  2.          MessageBox.Show("¿Desea guardar los cambios?")
  3. End If
Le preguntaría si desea guardar los cambios y luego cerraría el formulario.
Saludos.
__________________
Eduardo Peredo
Wigoin
  #6 (permalink)  
Antiguo 10/12/2009, 17:06
 
Fecha de Ingreso: octubre-2009
Mensajes: 70
Antigüedad: 14 años, 6 meses
Puntos: 0
De acuerdo Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

jajajaja Excelente Muchas graciassss, de las 2 soluciones que me dieron las junte y me dio lo que necesitaba, Muchas gracias.

Dejo el codigo por si alguien mas lo necesita
Código vb.net:
Ver original
  1. Private Sub nueva_factura_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  2.         Dim dlgRes As DialogResult
  3.         dlgRes = MessageBox.Show("Desea Cerrar y Guardar los Cambios Efectuados?", "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
  4.  
  5.         If sender.Equals(guardar) Then
  6.             Me.Dispose()
  7.         Else
  8.             If dlgRes = Windows.Forms.DialogResult.Yes Then
  9.                 Dim valor As Boolean
  10.                 valor = btnGuardar()
  11.  
  12.                 If valor = True Then
  13.                     Me.Dispose()
  14.                 End If
  15.  
  16.                 If valor = False Then
  17.                     e.Cancel = True
  18.                 End If
  19.  
  20.             End If
  21.  
  22.             If dlgRes = Windows.Forms.DialogResult.No Then
  23.                 Me.Dispose()
  24.             End If
  25.  
  26.         End If
  27.     End Sub
  #7 (permalink)  
Antiguo 12/12/2009, 11:12
 
Fecha de Ingreso: octubre-2009
Mensajes: 70
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

Ups!, disculpen, me equivoque no funciona de la manera en que habia puesto en el post anterior.
Intente de otra forma y tampoco funciono,

Código vb.net:
Ver original
  1. Private Sub nueva_factura_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  2.         Dim dlgRes As DialogResult
  3.         dlgRes = MessageBox.Show("Desea Cerrar y Guardar los Cambios Efectuados?", "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
  4.  
  5.         If e.CloseReason = CloseReason.UserClosing Then
  6.             If dlgRes = Windows.Forms.DialogResult.Yes Then
  7.                 Dim valor As Boolean
  8.                 valor = btnGuardar()
  9.                 If valor = True Then
  10.                     Me.Dispose()
  11.                 End If
  12.                 If valor = False Then
  13.                     e.Cancel = True
  14.                 End If
  15.             End If
  16.  
  17.             If dlgRes = Windows.Forms.DialogResult.No Then
  18.                 Me.Dispose()
  19.             End If
  20.         End If
  21.  
  22.     End Sub

y el boton guardar lo hago de esta manera
Código vb.net:
Ver original
  1. Private Sub guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles guardar.Click
  2.         If String.IsNullOrEmpty(txCodigoCli.Text) Then
  3.             ep.SetError(txCodigoCli, "Ingrese un Cliente")
  4.             If ListView1.Items.Count - 1 < 0 Then
  5.                 MessageBox.Show("Ingrese una Linea de Detalle ", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  6.                 Exit Sub
  7.             End If
  8.             Exit Sub
  9.         End If
  10.         ep.Clear()
  11.  
  12.         If ListView1.Items.Count - 1 < 0 Then
  13.             MessageBox.Show("Ingrese una Linea de Detalle ", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  14.             If String.IsNullOrEmpty(txCodigoCli.Text) Then
  15.                 ep.SetError(txCodigoCli, "Ingrese un Cliente")
  16.                 Exit Sub
  17.             End If
  18.             Exit Sub
  19.         End If
  20.         ep.Clear()
  21.  
  22.         Dim iva As String = obtenerIVA().ToString
  23.         iva = iva * 100
  24.         total = CalculaTotal()
  25.         Dim IdFactura As Integer = ingresar_factura(txCodigoCli.Text, txFecha.Text, total, txtOrden.Text, txtObs.Text, iva)
  26.  
  27.         Dim fila As Integer
  28.         For fila = 0 To ListView1.Items.Count - 1
  29.             Dim codProd As String = ListView1.Items(fila).SubItems(0).Text
  30.             Dim cantidad As String = ListView1.Items(fila).SubItems(3).Text
  31.             Dim precio As String = ListView1.Items(fila).SubItems(4).Text
  32.             Dim obs As String = ListView1.Items(fila).SubItems(6).Text
  33.             ingresar_detalle(codProd, IdFactura.ToString, precio, cantidad, obs)
  34.         Next
  35.         Me.Dispose()
  36.     End Sub

Espero me puedan ayudar y disculpen que moleste tanto.
Gracias
  #8 (permalink)  
Antiguo 12/12/2009, 11:39
danicuco
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

Hola chicos... por lo que entendí del problema de claudio es que de alguna forma tienes que saber cuando se cierra por pulsar el aspa o por venir del evento provocado por el boton guardar ¿no?.

Te dejo un link donde explican muy bien como saber cuando han pulsado el aspa creo que eso te solucionaria la cosa...

[URL="http://www.elguille.info/NET/vs2005/trucos/saber_si_cierra_el_formulario_desde_la_x.htm"]http://www.elguille.info/NET/vs2005/trucos/saber_si_cierra_el_formulario_desde_la_x.htm[/URL]

saludos
  #9 (permalink)  
Antiguo 15/12/2009, 09:35
 
Fecha de Ingreso: octubre-2009
Mensajes: 70
Antigüedad: 14 años, 6 meses
Puntos: 0
Pregunta Cerrar formulario y confirmar cierre al presiona el boton X del form

cualquier idea sirve, ayuda porfavor!
  #10 (permalink)  
Antiguo 15/12/2009, 11:06
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form

es simple cuando el formulario se cierre sea cual sea la razon tu quieres solo validar cuando el usuario no tenga el formulario lleno o hubiese guardado los cambios para ello tendria sque hacer en el form closing en esta secuencia

ManejadorDeEventoFormClosing

si sender es BotonGuardar
cierraestacosa
si no
entonces evaluas porque de las tantas razones estas cerrando y realizas las acciones
necesarias para que el usuario guarde sus datos o que se yo o muestras el dialogo
de estas realmente seguro ( y no antes como lo tienes actualmente)

ya tienes el codigo solo tienes que ajustarlo para que quede bien
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #11 (permalink)  
Antiguo 15/12/2009, 11:45
 
Fecha de Ingreso: octubre-2009
Mensajes: 70
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Cerrar formulario y confirmar cierre al presiona el boton X del form


Me habia equivocado al poner una linea de codigo, ya lo arregle y ahora si que si funka. Grasiaz muchas thanks
Código vb.net:
Ver original
  1. Private Sub nueva_factura_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  2.         Dim dlgRes As DialogResult    
  3.  
  4.         Select Case e.CloseReason
  5.             Case CloseReason.ApplicationExitCall
  6.             Case CloseReason.FormOwnerClosing
  7.             Case CloseReason.MdiFormClosing
  8.             Case CloseReason.None
  9.             Case CloseReason.TaskManagerClosing
  10.             Case CloseReason.UserClosing
  11.  
  12.                 dlgRes = MessageBox.Show("Desea Cerrar y Guardar los Cambios Efectuados?", "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
  13.                 If dlgRes = Windows.Forms.DialogResult.Yes Then
  14.                     Dim valor As Boolean
  15.                     valor = btnGuardar()
  16.                     If valor = False Then
  17.                         e.Cancel = True
  18.                     End If
  19.                 End If
  20.  
  21.             Case CloseReason.WindowsShutDown
  22.         End Select
  23.  
  24.     End Sub

Hay si que si, al evento del boton Guardar utilizo el Me.Dispose() y asi no me captura el formclosing, eso muchaschos gracias por las respuestas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:55.