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?

45
demandé sur Peter Mortensen 2010-05-06 20:07:09

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);
 }
18
répondu Jacob G 2010-05-06 16:16:44

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.

57
répondu stuartd 2010-05-06 16:16:50

, 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 et Unchecked est la même que précédemment.
  • La transition entre Checked et Indeterminate ne déclenche pas l'événement CheckedChanged, Car Checked reste true.
  • transition entre Unchecked et Indeterminate déclenche-t-il l'événement CheckedChanged, car Checked passe de false à 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 de Unchecked à 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).

6
répondu Dave Cousineau 2017-01-20 17:19:36

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

1
répondu John Line 2015-07-20 14:22:12

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.

-2
répondu TWood 2014-04-23 20:43:44