CheckBox CheckedChanged Windows Forms против CheckStateChanged - PullRequest
53 голосов
/ 06 мая 2010

Элемент управления CheckBox Windows Forms реализует события CheckedChanged и CheckStateChanged. Насколько я могу судить, оба запускаются, когда проверяется статус флажка.

CheckedChanged предшествует CheckStateChanged, но кроме этого я не вижу разницы. Я что-то пропустил? Должен ли один быть предпочтительнее другого?

Ответы [ 5 ]

60 голосов
/ 06 мая 2010

CheckState (и, следовательно, CheckStateChanged) позволяют использовать флажок, который может иметь три значения: он может быть установлен, не отмечен или «не определен» - т. Е. Для него ThreeState установлено значение true.

Если вы не используете ThreeState, тогда CheckedChanged - это все, что вам нужно.

20 голосов
/ 06 мая 2010

Полагаю, это связано с флажками трех состояний.Это кишки установщика 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);
 }
7 голосов
/ 20 января 2017

Два события фактически одинаковы, если вы не установите для свойства ThreeState значение true. Без установки ThreeState оба будут срабатывать, когда флажок установлен или снят, и оба будут запускать после , когда значение изменилось.

Основное отличие заключается в том, что вы устанавливаете ThreeState в значение true, что добавляет Indeterminate CheckState:

  • Элемент управления считает Indeterminate «проверенным». (Checked == true).
  • Переход между Checked и Unchecked такой же, как и раньше.
  • Переход от Checked к Indeterminate делает не событием CheckedChanged, потому что Checked остается true.
  • При переходе между Unchecked и Indeterminate происходит событие CheckedChanged, поскольку Checked изменяется с false на true или наоборот.
  • Если установить флажок для трех состояний, состояния перейдут с Unchecked на Checked на Indeterminate и обратно на Unchecked. Вы все еще можете программно переходить с Unchecked на Indeterminate.

(Обратите внимание на разницу между свойством Checked, которое является логическим свойством с двумя состояниями, и состоянием Checked, которое является одним из трех возможных значений свойства CheckState.)

TL; DR: Основное практическое отличие состоит в том, что событие CheckedChanged не срабатывает при установке флажка с тремя состояниями при переходе от CheckState.Checked к CheckState.Indeterminate или наоборот, поскольку оба состояния считаются проверенными. (Checked == true).

2 голосов
/ 20 июля 2015

Насколько я могу сказать:

CheckChanged срабатывает ДО изменения проверенного значения, поэтому .Checked возвращает значение WAS,

CheckStateChanged ПОСЛЕпроверенное значение изменяется, поэтому .Checked возвращает значение IS

0 голосов
/ 24 апреля 2014

CheckState срабатывает до принятия нового значения. CheckStateChanged срабатывает после подтверждения нового значения.

Если вы ищете dataset.haschanges для обновления после изменения значения флажка, вам нужно использовать событие checkstatechanged. Просто убедитесь, что отключили threestate, чтобы избежать проблем с NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...