Laden...

MessageBox wird nach dem Schließen gleich wieder angezeigt

Erstellt von stony17 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.710 Views
S
stony17 Themenstarter:in
36 Beiträge seit 2010
vor 9 Jahren
MessageBox wird nach dem Schließen gleich wieder angezeigt

Hallo,
ich habe eine Form-Applikation, welche manchmal im folgenden Code hängen bleibt.

private void btnChargeCheck_Click(object sender, EventArgs e)
        {
            if (txtChargennr.Text.Length > 0)
            {
                //Checken ob die Mittellagen-Teppich Dimension ausgewählt ist.
                if (rdB412mm.Checked || rdB494mm.Checked || rdB390mm.Checked)
                {
                    chargeninfo.Charge = txtChargennr.Text;
                    try
                    {
                        chargeninfo = Navision.GetChargeInformation(chargeninfo.Charge, MitarbeiterBenutzer.Benuter.bdearbeitsplatz);
                        if (chargeninfo.ChargeVerfügbar)
                        {
                            txtChargeArtikelnr.Text = chargeninfo.Artikelnr;
                            txtChargeArtikelbez.Text = chargeninfo.Artikelbez1;
                            txtChargeArtikelbez2.Text = chargeninfo.Artikelbez2;
                            txtChargeArtikelbez3.Text = chargeninfo.Artikelbez3;
                            txtChargeHolzart.Text = chargeninfo.Holzart;
                            txtChargeLagerort.Text = chargeninfo.Lagerort;
                            txtChargeLagerplatz.Text = chargeninfo.Lagerplatz;
                            txtChargeMengeM2.Text = chargeninfo.Menge.ToString();
                            decimal Chargenmenge = Math.Round(chargeninfo.MengeStk, 0);
                            txtChargeMengeStk.Text = Chargenmenge.ToString();
                            chargeninfo.LSVorgabe = Convert.ToInt16(ConfigReader.GetValue("H3L1LSVorgabeStkproStunde"));  //Für die H3L1 
                            txtChargeLSVorgabe.Text = chargeninfo.LSVorgabe.ToString();

                            try
                            {
                                if (!BDENavision.AdminModusAktiv)
                                {
                                    OPCProzess.WriteSPSTagDecimal(OPCProzess.SPSTagLSVorgabe, chargeninfo.LSVorgabe);
                                }
                                //NAVBDEProzess.PauseAktiv = false;
                            }
                            catch (Exception ex)
                            {
                                logger.Error("Fehler! LSVorgabe an SPS hat nicht funktioniert! " + ex.Message);
                                MessageBox.Show("Fehler! LSVorgabe an SPS hat nicht funktioniert! " + ex.Message, "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Charge " + chargeninfo.Charge + " nicht mehr verfügbar!", "CHARGEN-FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            chargeninfo.Reset();
                            txtChargennr.Text = chargeninfo.Charge;
                            txtChargeArtikelnr.Text = chargeninfo.Artikelnr;
                            txtChargeArtikelbez.Text = chargeninfo.Artikelbez1;
                            txtChargeArtikelbez2.Text = chargeninfo.Artikelbez2;
                            txtChargeArtikelbez3.Text = chargeninfo.Artikelbez3;
                            txtChargeLagerort.Text = chargeninfo.Lagerort;
                            txtChargeLagerplatz.Text = chargeninfo.Lagerplatz;
                            txtChargeHolzart.Text = chargeninfo.Holzart;
                            txtChargeMengeStk.Text = "";
                            txtChargeMengeM2.Text = "";
                            txtChargeLSVorgabe.Text = "";
                        }
                        logger.Info("Charge " + chargeninfo.Charge + " wurde geprüft! Charge Verfügbarstatus ist " + chargeninfo.ChargeVerfügbar);
                    }
                    catch (Exception ex)
                    {
                        logger.Error("Charge konnte nicht geprüft werden! " + ex.Message);
                        MessageBox.Show("Charge konnte nicht geprüft werden! " + ex.Message, "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error);                        
                    }
                }
                else
                {
                    MessageBox.Show("Bitte Mittellagen-Teppich Auswahl treffen!!", "WARNUNG", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            else
            {
                MessageBox.Show("Bitte Chargennr eingeben!", "INFORMATION", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

Und zwar bekommt man immer die Meldung vom letzten MessageBox-Befehl. Sprich "Bitte Chargennr eingeben!". Dann kann man OK-clicken und es erscheint wieder diese Meldung. Habe den ganzen Code durchsucht und nur zwei Verweise für "btnChargeCheck_Click" gefunden. Einmal im Code und einmal in Designer.cs Datei.
Wie kann man diesen Fehler herausfinden?
Besten Dank
stony

Hinweis von herbivore vor 9 Jahren

[****CSHARP]-Tags hinzugefügt

lg
stony

2.080 Beiträge seit 2012
vor 9 Jahren

Bitte, tu uns den Gefallen und nutze die c#-Tags, die machen es bedeutend einfacher, den Code zu lesen.

Außerdem wäre es ratsam, die Methode aufzuteilen. Wenn du jetzt sagst, das geht nicht, dann kann ich dir auf jeden Fall sagen: Das geht immer.
Und es ist bedeutend lesbarer.

Was das Hängen bleiben angeht:
Dein Programm hängt außerdem nach der Methode, nicht innen drin. Das sehe ich daran, dass die Message-Box, die du erwähnst, am Ende der Methode steht.
Dass du zwei Verweise findest, halte ich für nicht richtig. In der Designer.cs ist normal, dort wurde die Methode am Event registriert, aber die Event-Methode sollte darüber hinaus nirgendwo anders aufgerufen werden. Also entweder du meinst damit die Deklaration der Methode, oder du rufst die Event-Methode irgendwo nochmal auf. Wenn letzteres der Fall ist, dann würde ich da mal schauen.

Ansonsten hilft meistens der Debugger weiter, indem du einfach vorher einen Haltepunkt setzt und dann schaust, was nach dem ersten Öffnen der besagten MessageBox passiert.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo stony17,

was genau meinst du mit "bleibt in einer Schleife hängen"? Meinst du, dass jedes Mal, wenn man die MessageBox wegeklickt, sie sofort wieder erneut angezeigt wird? So dass du aus dieser Schleife nicht mehr herauskommst? Wie oft hast du probiert, die MessageBox zu schließen? Auch deutlich mehr als ein paar Mal?

Möglicherweise ist es gar keine Endlosschleife, sondern der EventHandler wurde einfach nur mehrfach für den Click-Event registriert, so das er auch mehrfach ausgeführt wird.

Was den Tipp mit dem Debugger angeht, siehe [Artikel] Debugger: Wie verwende ich den von Visual Studio?.

Bitte beachte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

MessageBoxen sind ohnehin out und verursachen zudem Probleme, weil sie die Reihenfolge der Event-Verarbeitung durcheinander bringen können. Daher kann ich von MessageBoxen nur abraten, siehe Warten auf Schließen einer anderen Form [und warum man Dialoge nicht modal machen sollte]. Es gibt wesentlich bessere und benutzerfreundlichere Alternativen, siehe [Snippet] Nicht-modale Abfrage als Alternative für MessageBoxen.

Nur um sicherzugehen: Oder meinst du "hängen" im Sinne von [FAQ] Warum blockiert mein GUI?

herbivore

H
523 Beiträge seit 2008
vor 9 Jahren

Wie kann man diesen Fehler herausfinden?

Mit einem Haltepunkt in der Funktion.

Das Verhalten kann auch auftreten, wenn der User mehrmals sehr schnell hintereinander auf den Button klickt. Dafür bietet es sich an, den Button am Anfang des Click-Ereignisses zu deaktivieren und am Ende wieder zu aktivieren.

S
stony17 Themenstarter:in
36 Beiträge seit 2010
vor 9 Jahren

Danke mal für die Vorschläge.
Mit "bleibt in einer Schleife hängen" meine ich, das jedes Mal, wenn man die Messagebox wegklickt, diese Meldung sofort wieder erscheint.
Habe diese ca. 10 weggeklickt und kommt immer wieder.
Mit den Debuggen ist das nicht so einfach, da diese im letzten Monat genau 2 mal passiert ist.

lg
stony

H
523 Beiträge seit 2008
vor 9 Jahren

Das bedeutet, dass die Click-Methode irgendwoher mehrmals aufgerufen wurde. Bist Du sicher, dass der Benutzer bei dem das aufgetreten ist nicht mehrfach auf den Button geklickt hat? Ich kenne einige Benutzer die gerne wie wild auf die Buttons klicken.

2.298 Beiträge seit 2010
vor 9 Jahren

Wird die Messagebox direkt über den Button oder z.B. über die Enter-Taste bestätigt? In zweiterem Falle kam es bei mir schon vor, das sofort der eigentliche Button wieder geklickt wurde.

Beheben lässt sich das über den beschriebenen Weg, die Schaltfläche nach dem Klicken zu deaktivieren.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

4.221 Beiträge seit 2005
vor 9 Jahren

Verwendest Du einen Barcodescanner in Deiner Anwendung ? (Fokus auf dem Button / löst ev. Den Click aus)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

3.825 Beiträge seit 2006
vor 9 Jahren

Du hast den Eventhandler sicher mehrmals registriert.

Wo führst Du diese Zeile aus ?

btnChargeCheck.Click += new System.EventHandler(btnChargeCheck_Click);

Und vor allem wie oft ?

Man könnte auch so schreiben :

btnChargeCheck.Click -= new System.EventHandler(btnChargeCheck_Click);
btnChargeCheck.Click += new System.EventHandler(btnChargeCheck_Click);

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3