2010-05-06 6 views
42

Das Windows Forms-Steuerelement CheckBox implementiert beide CheckedChanged und CheckStateChanged Ereignisse. Soweit ich das beurteilen kann, feuern beide, wenn der überprüfte Status der Checkbox geändert wird.Windows Forms CheckBox CheckedChanged vs. CheckStateChanged

CheckedChanged geht voraus CheckStateChanged, aber anders als das sehe ich keinen Unterschied. Fehle ich etwas? Sollte man einem anderen vorgezogen werden?

Antwort

18

Meine Vermutung wäre, dass es mit Tri-State-Checkboxen zu tun hat. Dies ist das Eingeweide des Checkstate-Setzers:

if (this.checkState != value) 
{ 
    bool flag = this.Checked; 
    this.checkState = value; 
    if (base.IsHandleCreated) 
    { 
    base.SendMessage(0xf1, (int) this.checkState, 0); 
    } 
    if (flag != this.Checked) 
    { 
    this.OnCheckedChanged(EventArgs.Empty); 
    } 
    this.OnCheckStateChanged(EventArgs.Empty); 
} 
55

Checkstate (und damit CheckStateChanged) ermöglicht eine Checkbox, die drei Werte haben kann: Es kann überprüft werden, nicht markiert oder ‚unbestimmt‘ - dh es ThreeState Satz muß wahr.

Wenn Sie ThreeState nicht verwenden, ist CheckedChanged alles, was Sie brauchen.

-2

CheckState wird ausgelöst, bevor der neue Wert festgeschrieben wird. CheckStateChanged wird ausgelöst, nachdem der neue Wert festgeschrieben wurde.

Wenn Sie nach Dataset.haschanges suchen, um nach einer Änderung der Checkbox-Werte eine Aktualisierung durchzuführen, müssen Sie das checkstatechanged-Ereignis verwenden. Stellen Sie sicher, dass Sie threestate deaktivieren, um Probleme mit NULL zu vermeiden.

+1

Dies ist falsch, beide Ereignisse werden ausgelöst, nachdem der Wert geändert wurde. –

1

Soweit ich sagen kann:

CheckChanged gefeuert wird, bevor der geprüfte Wert geändert wird, so .Checked kehrt, was der Wert WAR,

CheckStateChanged gefeuert wird, nachdem der geprüfte Wert geändert wird, so .Checked kehrt Was der Wert ist

+1

Dies ist falsch, beide Ereignisse werden ausgelöst, nachdem der Wert geändert wurde. –

4

Die beiden Ereignisse sind effektiv gleich, es sei denn, Sie setzen die ThreeState Eigenschaft auf true. Ohne dass ThreeState festgelegt wurde, werden beide ausgelöst, wenn das Kontrollkästchen aktiviert oder deaktiviert ist und beide feuern nach der Wert hat sich geändert.

Der Hauptunterschied ist, wenn Sie ThreeState auf true gesetzt haben, die das fügt IndeterminateCheckState:

  • Die Steuerung Indeterminate als „geprüft“ hält. (Checked == true).
  • Der Übergang zwischen Checked und Unchecked ist der gleiche wie zuvor.
  • Übergang zwischen Checked und Indeterminate tut nicht Feuer des CheckedChanged Ereignis, weil Checked Aufenthalte true.
  • Übergang zwischen Unchecked und Indeterminatetut Brand CheckedChanged Ereignis, weil Checked Änderungen von false zu true oder umgekehrt.
  • Wenn Sie auf ein Kontrollkästchen mit drei Status klicken, wechseln die Status von Unchecked zu Checked zu Indeterminate und zurück zu Unchecked.Sie können weiterhin programmgesteuert von Unchecked zu Indeterminate wechseln.

(Man beachte den Unterschied zwischen der Checked Eigenschaft, die eine Zweizustands boolesche Eigenschaft ist und der Checked Zustand, der einer der drei möglicher Werte der CheckState Eigenschaft.)

TL; DR: Der wichtigste praktische Unterschied besteht darin, dass das Ereignis CheckedChanged beim Übergang von CheckState.Checked zu CheckState.Indeterminate oder umgekehrt nicht auf ein Kontrollkästchen mit drei Status aktiviert wird, da beide Zustände als überprüft gelten (Checked == true).