Dove faccio a controllare il comportamento del pulsante di chiusura “X” in alto a destra di una WinForm?
-
27-09-2019 - |
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
.
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 ...!