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);
}
}
Dies ist kein Threading-Problem? Der gesamte GUI-Code muss vom Haupt-Thread aus aufgerufen werden. Ist Ihr Controller auf einem anderen Thread? – AnthonyLambert
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? –
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