Windows窗体的CheckBox CheckedChanged与CheckStateChanged

Windows窗体的CheckBox控件实现了CheckedChangedCheckStateChanged事件。 据我所知,checkbox的检查状态发生变化时都会触发。

CheckedChangedCheckStateChanged之前,但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之间的转换与以前相同。
  • CheckedIndeterminate之间的转换不会触发CheckedChanged事件,因为Checked保持为true
  • UncheckedIndeterminate之间的转换触发CheckedChanged事件,因为Checkedfalse更改为false ,反之亦然。
  • 点击三个状态checkbox,状态从未Unchecked转变为已CheckedIndeterminate并返回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的问题。