Ich habe ein Kontrollkästchen und ich habe das CheckedChanged-Ereignis abonniert. Der Handler führt dort einige Operationen aus. Ich überprüfe und deaktiviere das Kontrollkästchen programmgesteuert (zB: chkbx_Name.Checked = true
) und das CheckedChanged-Ereignis wird ausgelöst.
Ich möchte, dass dieses Ereignis nur ausgelöst wird, wenn ich es manuell ein- oder ausgeblendet habe. Gibt es eine Möglichkeit, das Auslösen dieses Ereignisses zu vermeiden, wenn ich es programmgesteuert ein- / auschecke?
Melden Sie das Ereignis ab, bevor Sie Folgendes festlegen:
%Vor%Dann können Sie den Wert programmgesteuert festlegen, ohne dass das Kontrollkästchen das CheckChanged-Ereignis auslöst:
%Vor%dann erneut abonnieren:
%Vor%[EDIT: 29. März 2012]
Das Problem mit Tanvis Ansatz besteht darin, dass Sie alle Quellen von manuell überprüfen oder deaktivieren müssen . Nicht, dass es zu viele gibt (es ist nur vom Mausklick und vom Benutzer durch Drücken der Leertaste), aber Sie müssen in Erwägung ziehen, ein refaktoriertes Ereignis von MouseClick und KeyUp (Erkennung der Leertaste) aufzurufen
Es ist für eine CheckBox (irgendein Kontrolleur für diese Angelegenheit) hübscher, von der Quelle der Benutzereingabe (Tastatur, Maus, etc.) agnostic zu sein, so dass ich dafür die programmatische Einstellung von CheckBox wirklich programmatisch mache. Beispielsweise können Sie die programmatische Einstellung der Eigenschaft auf eine Erweiterungsmethode umbrechen:
%Vor%Wenn Sie diesen Ansatz verwenden, kann Ihr Code sowohl mit der Mauseingabe als auch mit der Tastatureingabe über nur ein Ereignis, d. h. über CheckChanged, sauber reagieren. Keine Duplizierung von Code, keine Notwendigkeit, mehrere Ereignisse zu abonnieren (z. B. Tastatur, Aktivieren / Deaktivieren der CheckBox durch Drücken der Leertaste)
Nein. Diese Eigenschaftenänderungsereignisse werden ausgelöst, wenn sich der Eigenschaftswert ändert, unabhängig davon, ob dies durch den Code, den eigenen Code oder die Datenbindung des Steuerelements geschehen ist. Es ist normalerweise derselbe Codepfad.
Was Sie jedoch tun können, wenn Ihr Event-Handler in derselben Klasse wie der Code liegt, der den Eigenschaftswert ändert, ist die Einführung eines privaten booleschen Feldes in der Klasse, das Sie als Indikator dafür verwenden, ob sich die aktuelle Eigenschaft ändert wird von Ihrem Code oder vom Benutzer ausgelöst. Nach Ihrer Änderung setzen Sie es einfach zurück. Der Event-Handler würde dann das Feld betrachten und entscheiden, ob es etwas tun soll oder nicht:
%Vor%Es tut mir leid, dass ich Michael Böns Antwort nicht kommentieren kann, weil ich neu hier bin (kein Ruf), aber für das, was es wert ist, bevorzuge ich seine Lösung für Johannes Rössel aus mehreren Gründen.
>1) die checkedProgrammatically Variable ist ein bisschen zu nahe an global für mich. Es gibt nichts, was eine andere Methode daran hindern könnte, sie versehentlich auf "true" zu setzen, sodass alle Ihre Ereignisse gestoppt werden.
2) Sie könnten viele Variablen haben, abhängig von der Anzahl der Ereignisse, mit denen Sie zu tun haben. Es wäre einfach, das falsche zu ändern, und die Ergebnisse können schwer zu debuggen sein.
3) Es ist offensichtlicher, was Sie tun, wenn Sie sich abmelden und dann erneut abonnieren. Die ganze Logik ist genau da, und Sie müssen Ihre Event-Handler nicht ändern, um abhängig von bestimmten Bedingungen vorzeitig zu beenden.
Ich habe beide Methoden ausgiebig benutzt und ich finde Michaels auf lange Sicht viel einfacher.
Sie können eine boolesche Variable setzen, bevor Sie den Wert programmatisch ändern, und diese Variable im checkedchanged-Ereignis
zurücksetzen