.net Windows窗体';复选框CheckedChanged vs.CheckStateChanged

.net Windows窗体';复选框CheckedChanged vs.CheckStateChanged,.net,winforms,events,controls,.net,Winforms,Events,Controls,Windows窗体的CheckBox控件实现了CheckedChanged和CheckStateChanged事件。据我所知,当复选框的选中状态更改时,这两个选项都会触发 CheckedChanged在CheckStateChanged之前,但除此之外,我看不出有什么区别。我错过什么了吗?一个比另一个更受欢迎吗?我猜这与三态复选框有关。这是CheckState设置器的核心: if (this.checkState != value) { bool flag = this.Checked

Windows窗体的CheckBox控件实现了
CheckedChanged
CheckStateChanged
事件。据我所知,当复选框的选中状态更改时,这两个选项都会触发


CheckedChanged
CheckStateChanged
之前,但除此之外,我看不出有什么区别。我错过什么了吗?一个比另一个更受欢迎吗?

我猜这与三态复选框有关。这是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)允许使用具有三个值的复选框:可选中、未选中或“不确定”-即已设置为true


如果您没有使用ThreeState,则只需要CheckedChanged。

在提交新值之前激发CheckState。 CheckStateChanged在提交新值后激发

如果您正在查找dataset.haschanges以在修改复选框值后执行更新,则需要使用checkstatechanged事件。只要确保禁用threestate,以避免出现NULL进入的问题。

据我所知:

CheckChanged
在更改选中的值之前被激发,因此
.checked
返回值是什么


CheckStateChanged
是在选中的值更改后激发的,因此
.checked
返回值

除非将
ThreeState
属性设置为
true
,否则这两个事件实际上是相同的。如果未设置
ThreeState
,则在选中或取消选中复选框时都会触发,并且在值更改后都会触发

主要区别在于将
ThreeState
设置为true时,会添加
不确定的
检查状态

  • 控件认为
    不确定
    要“检查”。(
    选中==true
  • 在选中的
    和未选中的
    之间的转换与以前相同
    
  • Checked
    undeterminate
    之间转换不会触发
    CheckedChanged
    事件,因为
    Checked
    保持
    true
  • Unchecked
    undeterminate
    之间转换会触发
    CheckedChanged
    事件,因为
    Checked
    false
    更改为
    true
    ,反之亦然
  • 单击一个三状态复选框,状态从
    未选中
    转换为
    已选中
    不确定
    并返回到
    未选中
    。您仍然可以通过编程方式从
    未选中
    转换为
    不确定
(请注意
Checked
属性和
Checked
状态之间的差异,前者是两状态布尔属性,后者是
CheckState
属性的三个可能值之一。)


TL;DR:主要的实际区别是,
CheckedChanged
事件在从
CheckState.Checked
转换到
CheckState.Undeterminate
时不会触发三状态复选框,反之亦然,因为这两种状态都被视为选中(
Checked==true
).

不是对这个问题的正式回答,更多的是后续评论

我想在单击复选框时触发2个事件。在Designer文件中,我可以复制将事件添加到CheckedChanged的行,但只要我在设计屏幕中修改了某些内容,就只保留第一个事件


我的解决方案是在CheckedChanged中添加一个事件,在CheckStateChanged中添加另一个事件。这两个事件现在都会在单击复选框时触发。

这是false,两个事件都是在值更改后触发的。这是false,两个事件都是在值更改后触发的。这是true!非常简单,2步(选中,未选中)使用CheckedChanged,3步(选中,未选中,不确定)使用CheckStateChangedWhat
不确定
???复选框是未选中或选中的,那么什么是
不确定的
呢?请参阅答案中关于
ThreeState
属性的链接-“[ThreeState]获取或设置一个值,指示复选框是否允许三种而不是两种检查状态。”第三种状态是-,如果我没记错的话,处于该状态时,复选框将填充浅灰色。