Dove faccio a controllare il comportamento del pulsante di chiusura “X” in alto a destra di una WinForm?

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

Domanda

Sto avventurarsi a fare la mia applicazione VB.NET un po 'meglio per l'utilizzo da parte facendo alcune delle forme modali.

credo di aver capito come utilizzare dlg.Show () e dlg.Hide () invece di chiamare dlg.ShowDialog (). Ho un esempio del mio dialogo non modale nel mio modulo di domanda principale:

Public theModelessDialog As New dlgModeless

Per avviare la chiamata finestra di dialogo non modale I

theModelessDialog.Show()

e all'interno del OK e Annulla i gestori dei pulsanti in dlgModeless ho

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

e che sembra funzionare bene.

Il pulsante "X" in alto a destra mi sta ottenendo, però. Quando chiudo il modulo con quel pulsante, quindi provare a riaprire la maschera, ottengo

  

ObjectDisposedException è stata gestita. Non può accedere a un oggetto eliminato.

Mi sento come se fossi maggior parte del modo lì, ma io non riesco a capire come fare una delle seguenti operazioni:

  • Nascondi il pulsante "X"
  • Cattura l'evento in modo da non smaltire l'oggetto (proprio trattarlo come mi ha colpito Annulla)

Tutte le idee?

La classe di questa finestra di dialogo è System.Windows.Forms.Form.

È stato utile?

Soluzione

Usa Me.Close() per nascondere la forma. Per aprirlo, utilizzare il seguente frammento di codice:

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

Se questo è il salvataggio dei dati, allora avrete bisogno di capire un modo per riporlo (forse in una variabile statica / e in forma). Questo è il modo corretto di fare ciò che si sta cercando di ottenere comunque.

Avrete anche di perdonarmi se il mio VB è spento, è stato un po '.

Altri suggerimenti

Prendere l'evento FormClosing e, se il motivo è UserClosing, insieme Cancellare sull'evento su true.

Qualcosa di simile a quanto segue:

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

l'evento FormClosing mi permette di fare un'uscita gestita della forma così ho incluso una domanda di conferma per l'uscita. Ho anche un modulo bterminate bandiera per forzare il annullare dove lo voglio e non chiedo quindi la domanda. Grazie il vostro suggerimento mi ha aiutato così:)

    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 si nascondeva la forma nel suo codice e le risposte di cui sopra fornire una soluzione a questo caso. Spesso, però, non si è intenzione di utilizzare nuovamente il modulo, in modo da realmente do desidera che il modulo da smaltire. Tutte le attività connesse Chiudi saranno in un unico luogo, se si gestisce l'evento FormClosing utilizzando Me.FormClosing aggiungendolo al anyCancel / Chiudi / Codice di uscita che hai già. per esempio. in caso @ Giovanni:

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

Si noti l'uso del Me.Dispose invece di qualsiasi Me.Close esistente. Se si lascia il Me.Close si creerà un ciclo infinito. Vedere questo per le sottili differenze tra Chiudere e smaltire .

Sono d'accordo con la gestione dell'evento FormClosing. O modificare le proprietà del modulo per nascondere il controllo del sistema X.

Ho provato di tutto e non ha funzionato se si desidera solo per stretta, senza mostrare un messagebox, sarà sufficiente:

  

Private Sub FORM1_FormClosing (mittente come oggetto, e come FormClosingEventArgs) Maniglie Me.FormClosing

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)
  

End Sub

Spero che questo ti aiuta ...!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top