Komisches Problem beim Bestätigen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Unwesen.

    Komisches Problem beim Bestätigen

    Hallo,
    also ich will, dass wenn man meine Form schließt (auf das X drückt), dass dann eine MessageBox auftaucht und fragt "sind sie sicher, dass sie beenden wollen usw." jedoch taucht die MessageBox 2x auf. Habe folgenden Code:

    VB.NET-Quellcode

    1. 'EineForm_FormClosing
    2. If MessageBox.Show("Wirklich beenden?", "Test", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
    3. Application.Exit()
    4. Else
    5. e.Cancel = True
    6. End If


    Zurzeit habe ich 2 Formen. Bsp. Form1 & Form2. Als erstes wird Form1 gestartet, dann kann man durch einen Button die Form2 aufrufen (Form1 wird versteckt, umgekehrt das selbe). Bei beiden Formen habe ich den obigen Code ins FormClosing-Event gepackt, also dachte ich mir, deshalb muss man auch 2x bestätigen. Jedoch wenn ich den Code von Form1 auskommentiere und nur in Form2 benutze, dann kommt die Frage trotzdem 2x mal..auch wenn ich das 1. mal auf Ja und dann das 2. mal auf Nein drücke beendet sich die Form..

    Kann mir vielleicht jemand sagen warum das so ist?
    @SAR-71: das ist abhängig von den Projekteigenschaften
    Hallo Manga,

    in Form1 ist es unnötig ein Application.Exit oder sonstwas im FormClosing Event auszuführen was die Anwendung beendet, denn sie wird ja gerade beendet.

    In Form2 sieht das anderst aus.
    Ich würde abfragen ob Form2 noch ausgeführt wird und abhängig davon das dann beenden.

    EDIT:
    Ist das so gemeint ?

    Code Form1:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents f2 As Form2
    3. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    4. 'Nur Fragen wenn form2 noch lebt.
    5. If f2 IsNot Nothing Then
    6. If MessageBox.Show("Beenden ?", "Beenden ...", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
    7. 'wird sowieso beendet
    8. Else
    9. e.Cancel = True
    10. End If
    11. End If
    12. End Sub
    13. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    14. f2 = New Form2
    15. f2.Show(Me)
    16. End Sub
    17. 'Form2 wurde beendet -> Form1 auch beenden
    18. Private Sub f2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles f2.FormClosing
    19. f2.Dispose()
    20. f2 = Nothing
    21. Me.Close()
    22. End Sub
    23. End Class


    Code Form2:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    3. If MessageBox.Show("Beenden ?", "Beenden ...", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
    4. 'wird sowieso beendet
    5. Else
    6. e.Cancel = True
    7. End If
    8. End Sub
    9. End Class


    Gruss

    mikeb69

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mikeb69“ ()

    @mikeb69: warum sagst du mir das. Das weis ich doch xD
    @mikeb69 hab mal deinen Code in einem neuen Projekt probiert: Form1 startet, durch Buttonklick öffnet sich Form2, wenn ich nun auf das X klicke kommt die Frage ob es beendet werden soll. Klicke ich auf Ja beendet sich alles, klicke ich auf Nein beendet sich auch alles...? Außerdem kommt keine Frage, wenn nur Form1 offen ist, was ich aber auch noch brauche. Ich experimentiere mal noch rum, vielleicht find ich ja was^^
    Ich habs nun..war wirklich ein dummer Fehler. Was ich wollte: Form1 ist die Startform, wenn man aufs X klickt wird gefragt "beendet, ja/nein", wenn Ja dann alles Beenden. Per Buttonklick wird Form2 aufgerufen, wenn man dort nun auf X klickt soll das gleiche gefragt werden..jedoch kam dann halt immer 2 mal die Frage (1x von Form1, 1x von Form2). Hab nun folgenden Code:

    VB.NET-Quellcode

    1. 'Form1_FormClosing
    2. If Form2.Visible = False Then
    3. If MessageBox.Show("Wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then
    4. e.Cancel = True
    5. End If
    6. End If
    7. 'Form2_FormClosing
    8. If MessageBox.Show("Wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then
    9. e.Cancel = True
    10. Else
    11. Form1.Close()
    12. End If


    Also es klappt nun was ich wollte, hab nur vergessen zu fragen ob Form2 geöffnet ist oder nicht..wirklich keine Ahnung warum ich nich gleich darauf gekommen bin...
    und der Einzeiler dazu:

    VB.NET-Quellcode

    1. 'Form1_FormClosing
    2. e. Cancel = Not(Form2.Visible) AndAlso (MessageBox.Show("Wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No)
    3. 'Form2_FormClosing
    4. e.Cancel = MessageBox.Show("Wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No
    xD Form.Close() hat auch kein Rückgabewert und kann nicht in verglichen werden (und somit einen Boolean ergeben) AndAlso ist wie And ein logischer Operator. Vorteil bei AndAlso: ist im vornherein schon klar das False rauskommt (der Wert vor AndAlso ist False) wird nicht erst weiter abgefragt. Für Or gibts auch das OrElse welches genauso handelt.
    Schon gelöst?
    Wie auch immer, ich würde dafür eine globale Variable benutzen, ob e.cancel True oder False ist, bzw ob die Messagebox übersprungen wird, oder angezeigt werden soll.

    VB.NET-Quellcode

    1. Public Beende as Boolean
    2. 'Im FormClosing dann sowas wie
    3. If Beende = False then
    4. 'Sicherheitsabfrage.. Wollen Sie wirklich beenden?
    5. 'If Ergebnis True dann Beende=True : e.cancel =false ' FormClosing ist erlaubt, Programm beendet sich.
    6. end if

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Unwesen“ ()