Wo kann ich steuern das Verhalten der „X“ Schließen-Schaltfläche in der oberen rechten Ecke eines winform?
-
27-09-2019 - |
Frage
Ich Venturing in der Herstellung meiner VB.NET Anwendung ein wenig besser zu Einsatz von modal einige der Formen zu machen.
Ich glaube, ich habe herausgefunden, wie dlg.Show () und dlg.Hide () anstelle von Aufrufen dlg.ShowDialog () zu verwenden. Ich habe eine Instanz meines modalen Dialogs in meiner Hauptform:
Public theModelessDialog As New dlgModeless
Um den modalen Dialog ich Aufruf anwerfen
theModelessDialog.Show()
und innerhalb des OK und Abbrechen-Taste Handler in dlgModeless
Ich habe
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
und das scheint zu funktionieren.
Die Schaltfläche „X“ in der oberen rechten Ecke ist mir immer, though. Wenn ich das Formular mit dieser Taste schließen, dann versuchen, das Formular wieder zu öffnen, erhalte ich
ObjectDisposedException wurde nicht behandelt. Es kann kein angeordnete Objekt zugreifen.
Ich fühle mich wie die meisten der Weg dort bin, aber ich kann nicht herausfinden, wie eine der folgenden Funktionen ausführen:
- Ausblenden, dass "X" Taste
- Fangen Sie die Veranstaltung so dass ich von dem Objekt nicht entsorgen (es nur behandeln, wie ich Abbrechen Hit)
Irgendwelche Ideen?
Die Klasse dieses Dialoges ist System.Windows.Forms.Form
.
Lösung
Mit Me.Close()
das Formular auszublenden. Um sie zu öffnen, verwenden Sie das folgende Snippet:
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
Wenn diese Daten zu speichern, dann werden Sie eine Möglichkeit, es zu speichern Abbildung müssen (vielleicht in einer statischen Variablen / s in Form). Dies ist die richtige Art und Weise zu tun, was Sie versuchen, obwohl zu erreichen.
Sie finden auch, mir zu verzeihen, wenn mein VB ausgeschaltet ist, ist es schon eine Weile her.
Andere Tipps
Fangen Sie die Formclosing Ereignis und, wenn der Grund ist UserClosing, Satz auf das Ereignis Abbrechen, um wahr.
So etwas wie die folgenden:
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
das Formclosing Ereignis ermöglicht es mir, einen verwaltete Ausgang der Form zu tun, damit ich eine Frage zur Bestätigung Ausfahrt aufgenommen habe. Ich habe auch eine Form Flagge bterminate, um die Kraft aufzuheben, wo ich es haben will und daher nicht die Frage stellen. Dank Ihr Vorschlag half mir auch:)
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 wurde Ausblenden die Form in seinem Code und die Antworten über eine Lösung zu diesem Fall geben. Oft aber, planen Sie nicht das Formular erneut zu verwenden, so dass Sie wirklich tun wollen, dass die Form entsorgt werden. Alle Schließen damit verbundenen Aktivitäten werden in einem Ort, wenn Sie die Formclosing-Ereignis behandeln Me.FormClosing
mit, indem es anyCancel / Close / Exit-Code hinzu, dass Sie bereits haben. z.B. in @ John Fall:
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
Beachten Sie die Verwendung des Me.Dispose
anstelle eines bestehenden Me.Close
. Wenn Sie die Me.Close
verlassen werden Sie eine Endlosschleife erstellen. Siehe dies für die feinen Unterschiede zwischen Schließen und Entsorgen .
Vereinbaren Sie mit dem Formclosing Event-Handling. Oder die Eigenschaften auf dem Formular ändert das System X-Steuerelement zu verbergen.
Ich habe alles versucht und es hat nicht funktioniert wenn man nur schließen möchten, ohne eine messagebox zeigt, werden Sie brauchen nur:
Private Sub FORM1_FormClosing (Absender als Gegenstand, e As FormClosingEventArgs) Griffe Me.FormClosing
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
End Sub
Hope dies hilft Ihnen ...!