Подтвердить что ты не робот

CheckBox для Windows Forms CheckedChanged и CheckStateChanged

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

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

4b9b3361

Ответ 1

Я предполагаю, что это связано с флажками tri-state. Это мужество установщика 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);
 }

Ответ 2

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

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

Ответ 3

Два события фактически одинаковы, если вы не установите для свойства 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).

Ответ 4

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

CheckChanged запускается до того, как измененное значение изменяется, поэтому .Checked возвращает значение WAS,

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

Ответ 5

CheckState срабатывает до того, как будет зафиксировано новое значение. CheckStateChanged срабатывает после совершения нового значения.

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