.net Windows窗体';复选框CheckedChanged vs.CheckStateChanged
Windows窗体的CheckBox控件实现了.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
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]获取或设置一个值,指示复选框是否允许三种而不是两种检查状态。”第三种状态是-,如果我没记错的话,处于该状态时,复选框将填充浅灰色。