Case à cocher CheckedChanged vs CheckStateChanged de Windows Forms
Le contrôle CheckBox
de Windows Forms implémente à la fois les événements CheckedChanged
et CheckStateChanged
. Pour autant que je sache, les deux se déclenchent lorsque l'état vérifié de la case à cocher est modifié.
CheckedChanged
précède CheckStateChanged
, mais à part cela, je ne vois aucune différence. Ai-je raté quelque chose? Doit-on être préférée à une autre?
5 réponses
Je suppose que cela a à voir avec les cases à cocher à trois états. C'est le courage du setter CheckState:
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);
}
CheckState (et donc CheckStateChanged) permet d'utiliser une case à cocher qui peut avoir trois valeurs: elle peut être cochée, décochée ou 'indéterminée' - c'est-à-dire qu'elle a ThreeState défini sur true.
Si vous n'utilisez pas ThreeState, CheckedChanged est tout ce dont vous avez besoin.
, Les deux événements sont effectivement les mêmes, sauf si vous définissez la ThreeState
la propriété de true
. Sans avoir défini ThreeState
, les deux se déclenchent lorsque la case à cocher est cochée ou décochée et les deux se déclenchent après que la valeur a changé.
La principale différence est lorsque vous définissez ThreeState
sur true, ce qui ajoute le Indeterminate
CheckState
:
- le contrôle considère que
Indeterminate
est "vérifié". (Checked == true
). - La transition entre
Checked
etUnchecked
est la même que précédemment. - La transition entre
Checked
etIndeterminate
ne déclenche pas l'événementCheckedChanged
, CarChecked
restetrue
. - transition entre
Unchecked
etIndeterminate
déclenche-t-il l'événementCheckedChanged
, carChecked
passe defalse
àtrue
ou vice-versa. - en cliquant sur une case à cocher à trois états, les États passent de
Unchecked
àChecked
àIndeterminate
et reviennent àUnchecked
. Vous pouvez toujours passer deUnchecked
àIndeterminate
par programmation.
(notez la différence entre la propriété Checked
, qui est une propriété booléenne à deux états, et l'état Checked
, qui est l'une des trois valeurs possibles de la propriété CheckState
.)
TL; DR: la principale différence pratique est que l'événement CheckedChanged
ne se déclenche pas sur une case à cocher à trois états lors de la transition de CheckState.Checked
à CheckState.Indeterminate
ou vice-versa, car les deux états sont considérés comme vérifiés (Checked == true
).
Pour autant que je sache:
CheckChanged
est déclenché avant que la valeur vérifiée ne soit modifiée, donc .Checked
renvoie la valeur,
CheckStateChanged
est déclenché après la modification de la valeur vérifiée, donc .Checked
renvoie la valeur
Checkstate se déclenche avant que la nouvelle valeur ne soit validée. Checkstatechanged se déclenche après la validation de la nouvelle valeur.
Si vous recherchez un ensemble de données.haschanges pour effectuer une mise à jour après une modification de la valeur d'une case à cocher, vous devez utiliser l'événement checkstatechanged. Assurez-vous simplement de désactiver threestate pour éviter les problèmes avec NULL.