2016-06-22 8 views
4

Ich arbeite an einer Windows Forms App und bin an einen Punkt gekommen, an dem ich nicht verstehen kann, was passiert.Entfernen von Ereignishandlern in C#

Ich habe so etwas wie eine MVC-Architektur. Manchmal möchte ich, dass Steuerelemente, die zu der Ansicht gehören, aufhören, auf Ereignisse zu hören. Ich nenne nur diese Methode mit falsch als Parameter, wenn ich einen Event-Handler entfernen möchten: Also ich in der Ansicht Code eine Methode geschrieben haben, die wie folgt aussieht:

public void enableEventHandlers(bool enable) 
{ 
    if (enable) 
    { 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

Die Sache ist. Wenn ich diese Methode innerhalb des Ansichtscodes aufrufen, funktioniert es gut. Aber wenn ich diese Methode innerhalb des Controller-Codes aufrufen, funktioniert es nicht (die Event-Handler werden nicht entfernt).

einfach ein wenig mehr Kontext zu geben:

Dies funktioniert:

public partial class View : Form 
{ 
    public void enableEventHandlers(bool enable) 
    { 
     // The code I already showed 
    } 

    public void doSomething() 
    { 
     enableEventHandlers(false); 
     // do something 
     enableEventHandlers(true); 
    } 
} 

Diese doens't Arbeit:

public class controller 
{ 
    private View myView; 

    public void doSomething() 
    { 
     myView.enableEventHandlers(false); 
     // Do something... but somehow everything inside my Form is still paying attention to events 
     myView.enableEventHandlers(true); 
    } 
} 
+0

Dies ist kein Threading-Problem? Der gesamte GUI-Code muss vom Haupt-Thread aus aufgerufen werden. Ist Ihr Controller auf einem anderen Thread? – AnthonyLambert

+3

Da Ihr Code tatsächlich so aussieht, als ob er tun sollte, was Sie wollen, denke ich, wir brauchen etwas mehr Kontext. Können Sie versuchen, ein [mcve] (http://stackoverflow.com/help/mcve) zu erstellen, damit wir das Problem reproduzieren können? –

+0

Darüber hinaus können Sie überprüfen, ob der Ereignishandler tatsächlich registriert ist, bevor Sie versuchen, ihn zu entfernen. Dasselbe gilt für das Hinzufügen eines Handlers. Stellen Sie sicher, dass derzeit kein Handler registriert ist. Außerdem ist Ihr Formular eine Teilklasse. Stellen Sie sicher, dass der Initialisierungscode keinen Ereignishandler registriert. Besser, den Designer für WinForms Dev zusammen zu vermeiden. Erstellen Sie einfach eine Klasse, die Formularen unterordnet und schreiben Sie den Code selbst. Sie haben eine bessere Kontrolle über Ihr Endprodukt. Sie sollten auch Ihr UI-Design berücksichtigen. Wenn Sie Handler wie diese entfernen müssen, ist es wahrscheinlich falsch. – ManoDestra

Antwort

-2

Ich weiß nicht, ob es das ist, aber Sie didn Initialisiere deine Ansicht nicht. Sie sagen nur "private View view", aber das zeigt nirgendwo hin. Sie möchten entweder eine neue Ansicht erstellen, indem Sie private Ansicht v = neue Ansicht() ausführen, oder diese Ansicht auf die Ansicht verweisen, in der Sie die Ereignisse ändern möchten.

+1

Also hätte er eine 'NullReferenceException' erwischt, von der er uns bestimmt erzählt hätte. –

0

Endlich fand ich das Problem. Es scheint, dass ich irgendwie einen Event-Handler zweimal an das gleiche Control angehängt habe. Ich konnte die genaue Zeilennummer, wo ich das tat, nicht finden. Die Lösung, die ich gefunden habe, ist, einen Event-Handler zu entfernen, bevor ich einen neuen hinzufüge. Also die Methode enableEventHandlers sieht nun wie folgt aus:

public void enableEventHandlers(bool enable) { 
    if (enable) 
    { 
     control.someEvent -= someEventHandler; 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

Vielen Dank für Ihre Antworten.

Verwandte Themen