¿Dónde puedo controlar el comportamiento del botón de cierre “X” en la esquina superior derecha de un WinForm?
-
27-09-2019 - |
Pregunta
estoy haciendo aventurarse en mi aplicación VB.NET un poco mejor al uso al incluir algunas de las formas modales.
creo que he descubierto cómo utilizar dlg.Show () y dlg.Hide () en lugar de llamar dlg.ShowDialog (). Tengo una instancia de mi diálogo no modal en mi forma principal de la aplicación:
Public theModelessDialog As New dlgModeless
Para disparar la llamada de diálogo no modal I
theModelessDialog.Show()
y dentro de la OK y Cancelar manipuladores de botón en dlgModeless
tengo
Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Hide()
End Sub
Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Hide()
End Sub
y que parece que funcionan bien.
El botón "X" en la parte superior derecha me está consiguiendo, sin embargo. Al cerrar el formulario con ese botón, a continuación, intenta abrir el formulario, recibo
ObjectDisposedException fue no controlada. No se puede acceder a un objeto desechado.
Me siento como si estuviera la mayor parte del camino, pero no puedo encontrar la manera de hacer cualquiera de los siguientes:
- Ocultar ese botón "X"
- capturar el evento, así que no disponer del objeto (justo tratarlo como me golpeó Cancelar)
¿Alguna idea?
La clase de este diálogo es System.Windows.Forms.Form
.
Solución
Uso Me.Close()
para ocultar el formulario. Para abrirlo, utilice el siguiente fragmento:
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
Si esto es guardar los datos, entonces usted tiene que averiguar alguna forma de almacenarla (tal vez en una variable estática / s en el formulario). Esta es la forma correcta de hacer lo que está tratando de lograr sin embargo.
También tendrá que perdonarme si mi VB está apagado, se ha pasado un tiempo.
Otros consejos
Coger el caso FormClosing y, si la razón se UserClosing, conjunto Cancelar en el evento en true.
Algo parecido a lo siguiente:
Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _
Handles Form1.FormClosing
if e.CloseReason = CloseReason.UserClosing then
e.Cancel = true
Me.Hide()
end if
End Sub
caso FormClosing me permite hacer una salida ordenada de la forma, así que he incluido una pregunta para confirmar a la salida. También tengo una bterminate forma de la bandera de forzar al cancelar donde yo quiero que por lo que no haga la pregunta. Gracias a su sugerencia me ayudó así:)
Dim msgboxresponse As MsgBoxResult
If e.CloseReason = CloseReason.UserClosing Then
If Not Me.bTerminate Then
msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
If msgboxresponse <> MsgBoxResult.Yes Then
e.Cancel = True
Return
End If
End If
End If
@ John se ocultaba la forma en su código y las respuestas por encima de proporcionar una solución a ese caso. A menudo, sin embargo, usted no está planeando utilizar el formulario de nuevo, por lo que realmente hacer desea que el formulario que hay que eliminar. Todas las actividades relacionadas Cerrar estarán en un solo lugar si controlar el evento FormClosing usando Me.FormClosing
añadiéndolo a anyCancel / Cerrar código / salida que ya tiene. p.ej. en el caso de John @:
Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub
Tenga en cuenta el uso de la Me.Dispose
en lugar de cualquier Me.Close
existente. Si sale de la Me.Close
que va a crear un bucle infinito. Ver esto para las sutiles diferencias entre Cerrar y botar .
De acuerdo con el manejo del evento FormClosing. O cambiar las propiedades de la forma de ocultar el control del sistema X.
Lo he intentado todo y no funcionó Si lo que desea es estrecha, sin mostrar un cuadro de mensaje, sólo tendrá:
Private Sub FORM1_FormClosing (remitente como objeto, e como FormClosingEventArgs) dirige Me.FormClosing
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
End Sub
Espero que esto ayude ...!