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的问题。