Laden...

FormClosing event wird zweimal ausgelöst

Erstellt von filmee24 vor 9 Jahren Letzter Beitrag vor 4 Jahren 3.422 Views
F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren
FormClosing event wird zweimal ausgelöst

hallo,
ich möchte eine Nachricht erscheinen lassen wenn der Benutzer ungespeicherte Daten im Programm hat, wenn geschlossen wird, das funktioiert auch, aber die Nachricht kommt 2-Mal.


 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(Application.isDirty)
            {
                if(MessageBox.Show("Would you close without saving changes?", "Close?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    System.Windows.Forms.Application.Exit();
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

C. Anders

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo filmee24,

vermutlich hast du den EventHandler mehr als einmal registriert.

herbivore

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren

ich habe geschaut, ist nur einmal registriert

wenn ich steppe, geht er ab System.Windows.Forms.Application.Exit(); zurück zum event und startet erneut

C. Anders

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 9 Jahren

hat sich erledit, habe Application.Exit entfernt

C. Anders

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo filmee24,

ist eigentlich klar. Wenn du Exit aufrufst ist die Form ja noch da, somit ist alles noch registriert und er geht nochmal rein.

Es gibt das CloseReason-Enum. Das ist "UserClosing" wenn der User es ausgelöst hat. Das könntest du abfragen.

EDIT: Zu langsam, hast ja schon eine Lösung

Gruss

Coffeebean

S
20 Beiträge seit 2019
vor 4 Jahren

Hallo leider habe ich dazu auch eine Frage:

Ich habe 1. Form (Benutzer/Passwort Eingabe), bei richtiger Eingabe geht er in Form 2


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Easy_DienstPlan
{
    public partial class Easy_Dienstplan_main : Form
    {
        public string UserName { get; set; }
        public Easy_Dienstplan_main()

        {

            InitializeComponent();
        }

        private void Easy_Dienstplan_main_Load(object sender, EventArgs e)
        {
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Easy_Dienstplan_main_FormClosing);
            lbl_Anzeige_Benutzer.Text = "Hallo, Marc Franz.";
        }
        private void Easy_Dienstplan_main_FormClosing(Object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("Möchtest du wirklich beenden?\nNicht gespeichertes geht verloren!", "Easy Dienstplan beenden!", MessageBoxButtons.OK);
            Application.Exit();
        }
    }
}

nun wenn ich auf Beenden gehe (klick auf das X) fragt er 2 mal ab...und beendet dann.

Wenn ich MessageBox.Show
entferne, dann beendet er natürlich ohne abfrage..

Wieso macht er das...das es mit MEssageBox.Show 2 mal abgefragt wird und dann beendet?

Sorry stehe auf dem Schlauch.

Sorry

hier könnte deine Signatur stehen!

49.485 Beiträge seit 2005
vor 4 Jahren

Hallo Shayliar,

die Lösung steht oben doch schon: Mit Application.Exit stößt du das Schließen gleich nochmal an.
Wenn das Form geschlossen werden soll, musst du gar nichts machen.
Wenn es offen bleiben soll, setzt du e.Cancel auf true.
Das ist alles.

Um diese Entscheidung zu treffen, sollte/muss die MessageBox mindestens zwei Button haben. Wie das zum Beispiel geht, steht auch oben, auch wenn ich eher Ja/Nein Buttons verwenden würde, oder noch besser eine MessageBox gleich ganz vermeiden würde, z.B. mit [Snippet] Nicht-modale Abfrage als Alternative für MessageBoxen oder allgemeiner mit Nenne deinen Fall, wo du denkst, ohne modalen Dialog geht es nicht, und ich nenne eine Alternative.

herbivore

PS: Solltest du das Application.Exit doch benötigen, darfst du die Aktionen im FormClosing-Event nur durchführen, wenn der CloseReason UserClosing ist. Wird auch schon oben erwähnt.