Wo kann ich steuern das Verhalten der „X“ Schließen-Schaltfläche in der oberen rechten Ecke eines winform?

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

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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top