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
Indeterminateest "vérifié". (Checked == true). - La transition entre
CheckedetUncheckedest la même que précédemment. - La transition entre
CheckedetIndeterminatene déclenche pas l'événementCheckedChanged, CarCheckedrestetrue. - transition entre
UncheckedetIndeterminatedéclenche-t-il l'événementCheckedChanged, carCheckedpasse defalseàtrueou vice-versa. - en cliquant sur une case à cocher à trois états, les États passent de
UncheckedàCheckedàIndeterminateet reviennent àUnchecked. Vous pouvez toujours passer deUncheckedàIndeterminatepar 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.