Laden...

Events entprellen (ContextMenuItem Klick)

Erstellt von warpi vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.281 Views
W
warpi Themenstarter:in
21 Beiträge seit 2010
vor 13 Jahren
Events entprellen (ContextMenuItem Klick)

Hi,

ich öffne über ein Contextmenu ein neues Tab in einem Tabcontrol.

Mein Problem ist nun dass das Event das mit dem ContextmenuItem verknüpft ist ca 5-10mal aufgerufen wird, was natürlich zur folge hat das ebenso viele Tabs geöffnet werden.

Im moment umgehe ich das ganze mit einem kurzen Timer und einem busy Flag in der Art:


bool NewObjectToolStripMenuItem_Click_Busy = false;
        private void NewObjectToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!NewObjectToolStripMenuItem_Click_Busy)
            {
                NewObjectToolStripMenuItem_Click_Busy = true;
                
                machwas();

                System.Timers.Timer timer = new System.Timers.Timer();
                timer.Elapsed += new System.Timers.ElapsedEventHandler(delegate 
                    {
                        NewObjectToolStripMenuItem_Click_Busy = false;
                        timer.Stop();
                    }
                );
                timer.Interval = 500;
                timer.Start();
            }
        }

Das funktioniert zwar, aber schön ist es nicht 😃

Fällt einem da spontan eine bessere möglichkeit ein?

  • Wenn ich den flag direkt nach mchwas(); wieder auf false setze bewirkt er nichts.

warpi

Gelöschter Account
vor 13 Jahren

Im moment umgehe ich das ganze mit einem kurzen Timer und einem busy Flag in der Art:

ja, so macht man das in der microcontrollertechnik.
aber nciht in c# auf dem desktop einer normalen software...

Fällt einem da spontan eine bessere möglichkeit ein?

ich würde spontan behaupten, das dein eventhandler 5-10 mal registriert ist. das einfachste in so einem fall ist, sich immer vor der registrierung eine unregistrierung durchzuführen. so kann man sicherstellen, das man immer nur ein mal registriert ist.

edit: ach ja und deine "flag" geschichte würde dir in einer multicore umgebung im release code ganz schnell böse überraschungen bereiten.... mach dich über das "volatile" schlüsselwort her 😉

916 Beiträge seit 2008
vor 13 Jahren

Hallo warpi,

die entscheidende Frage ist doch warum das Event 10 mal kommt!

Eine trotzdessen bessere Möglichkeit wäre in meinen Augen dich von dem Event abzumelden, wenn du es jedoch danach wieder brauchst dann ist das auch keine Lösung. Wobei wir wieder bei der Frage der 10 Events sind, weil ein Click event sollte nur einmal pro click kommen.

Kann es vielleicht sein das du dich mehrmals an das Event angemeldet hast?

[edit] Jack war schneller.

Again what learned...

W
warpi Themenstarter:in
21 Beiträge seit 2010
vor 13 Jahren

ihr beiden habt recht, ich habs wirklich immer wieder registriert mit hand an kopf hau

Wenn ichs vorher deregistriert klappts einwandfrei.

Danke für die schnelle Hilfe 😃

Und das mit volatile werd ich mir auch mal zu Gemüte führen. thx

warpi

5.299 Beiträge seit 2008
vor 13 Jahren

Wenn ichs vorher deregistriert klappts einwandfrei. und kannst dus nicht genau einmal registrieren, zb im konstruktor, oder im Form_Load?

edit: dann braucht man auch nix mit multicore und Flags und volatile, sondern wenns klickt flutschtes. 😉

Der frühe Apfel fängt den Wurm.

W
warpi Themenstarter:in
21 Beiträge seit 2010
vor 13 Jahren

Jap, kann ich machen und hab ich inzwischen auch gemacht. 😃

Ich baue das Contextmenu dynamisch zusammen und hatte deshalb die Event Registrierung mit in die Methode gepackt in der das Menu aufgebaut wird.

Ich weiss auch nicht mehr was ich mir dabei gedacht habe ^^

Gruß,
warpi