Windows窗体的CheckBox CheckedChanged与CheckStateChanged
Windows窗体的CheckBox
控件实现了CheckedChanged
和CheckStateChanged
事件。 据我所知,checkbox的检查状态发生变化时都会触发。
CheckedChanged
在CheckStateChanged
之前,但CheckStateChanged
我没有看到任何区别。 我错过了什么吗? 应该比另一个更受欢迎吗?
我的猜测是,它必须与三态checkbox。 这是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(以及CheckStateChanged)允许使用一个checkbox,它可以有三个值:可以选中,不选中或者“不确定” – 也就是将ThreeState设置为true。
如果你不使用ThreeState,那么CheckedChanged就是你所需要的。
除非将ThreeState
属性设置为true
否则两个事件实际上是相同的。 如果没有设置ThreeState
,当checkbox被选中或者未选中时,两者都会触发,并且两个值都会在值更改后触发。
主要的区别是当你设置ThreeState
为true时,添加了Indeterminate
CheckState
:
- 控制器认为“
Indeterminate
”被“检查”。 (Checked == true
)。 - “
Checked
和“Unchecked
之间的转换与以前相同。 -
Checked
和Indeterminate
之间的转换不会触发CheckedChanged
事件,因为Checked
保持为true
。 -
Unchecked
和Indeterminate
之间的转换会触发CheckedChanged
事件,因为Checked
从false
更改为false
,反之亦然。 - 点击三个状态checkbox,状态从未
Unchecked
转变为已Checked
为Indeterminate
并返回Unchecked
。 您仍然可以以编程方式从“Unchecked
转换为“Indeterminate
。
(请注意Checked
属性(两个状态的布尔值属性)和Checked
状态之间的区别, Checked
状态是CheckState
属性的三个可能值之一。
TL; DR:主要的实际区别在于CheckedChanged
事件在从CheckState.Checked
过渡到CheckState.Indeterminate
或反过来时由于两个状态都被认为被检查而被触发( Checked == true
)。
据我所知,
CheckChanged
在被选中的值被改变之前被触发,所以.Checked
返回什么值WAS,
CheckStateChanged
在被选中的值被改变后被触发,所以.Checked
返回值IS
CheckState在提交新值之前触发。 提交新值后触发CheckStateChanged。
如果在checkbox值修改后,您正在查找dataset.haschanges进行更新,则需要使用checkstatechanged事件。 只要确保禁用三态就可以避免出现NULL的问题。