CheckBox для Windows Forms CheckedChanged и CheckStateChanged
Элемент управления Windows Forms CheckBox
реализует как события CheckedChanged
, так и CheckStateChanged
. Насколько я могу судить, оба запускаются, когда измененный статус флажка изменяется.
CheckedChanged
предшествует CheckStateChanged
, но кроме этого я не вижу разницы. Я что-то упускаю? Должен ли быть предпочтительнее другого?
Ответы
Ответ 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.