¿Dónde puedo controlar el comportamiento del botón de cierre “X” en la esquina superior derecha de un WinForm?

StackOverflow https://stackoverflow.com/questions/2838979

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.

¿Fue útil?

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 ...!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top