【发布时间】:2011-02-16 11:24:54
【问题描述】:
Windows 窗体的CheckBox 控件实现CheckedChanged 和CheckStateChanged 事件。据我所知,当复选框的选中状态发生更改时,两者都会触发。
CheckedChanged 在CheckStateChanged 之前,但除此之外我看不出有什么区别。我错过了什么吗?是否应该优先于另一个?
【问题讨论】:
标签: .net winforms events controls
Windows 窗体的CheckBox 控件实现CheckedChanged 和CheckStateChanged 事件。据我所知,当复选框的选中状态发生更改时,两者都会触发。
CheckedChanged 在CheckStateChanged 之前,但除此之外我看不出有什么区别。我错过了什么吗?是否应该优先于另一个?
【问题讨论】:
标签: .net winforms events controls
不是对这个问题的官方回答,而是更多的后续评论。
我想在单击 CheckBox 时触发 2 个事件。在 Designer 文件中,我可以复制将事件添加到 CheckedChanged 的行,但只要我在 Design 屏幕中修改某些内容,就只会保留第一个事件。
我的解决方案是在 CheckedChanged 中添加一个事件,在 CheckStateChanged 中添加另一个事件。现在单击 CheckBox 时会触发这两个事件。
【讨论】:
除非您将ThreeState 属性设置为true,否则这两个事件实际上是相同的。在没有设置ThreeState 的情况下,当复选框被选中或取消选中时,两者都会触发,并且都会在值更改后触发。
主要区别在于您将ThreeState 设置为true 时,会添加Indeterminate CheckState:
Indeterminate 视为“已检查”。 (Checked == true)。Checked 和 Unchecked 之间的转换与以前相同。 Checked 和 Indeterminate 之间的转换不会触发CheckedChanged 事件,因为Checked 保持true。Unchecked 和Indeterminate 之间转换确实会触发CheckedChanged 事件,因为Checked 从false 更改为true,反之亦然。Unchecked 转换为Checked 再转换为Indeterminate 并返回Unchecked。您仍然可以通过编程方式从 Unchecked 转换到 Indeterminate。(注意Checked 属性和Checked 状态之间的区别,Checked 是CheckState 属性的三个可能值之一。)
TL;DR:主要的实际区别是CheckedChanged 事件不会在从CheckState.Checked 转换到CheckState.Indeterminate 时触发三状态复选框,反之亦然,因为这两种状态都被视为已选中(Checked == true)。
【讨论】:
据我所知:
CheckChanged 在检查值更改之前被触发,因此.Checked 返回值 WAS,
CheckStateChanged 在检查值更改后被触发,所以.Checked返回值是什么
【讨论】:
CheckState 在提交新值之前触发。 CheckStateChanged 在新值提交后触发。
如果您在复选框值修改后寻找 dataset.haschanges 进行更新,您需要使用 checkstatechanged 事件。只需确保禁用三态以避免 NULL 进入那里的问题。
【讨论】:
CheckState(因此 CheckStateChanged)允许使用可以具有三个值的复选框:它可以被选中、未选中或“不确定” - 即它将 ThreeState 设置为 true。
如果您不使用 ThreeState,那么您只需要 CheckedChanged。
【讨论】:
indeterminate ???复选框要么未选中,要么选中,那么indeterminate 是什么?
ThreeState 属性的链接 - "[ThreeState] 获取或设置一个值,该值指示 CheckBox 是否允许 三个检查状态 而不是超过两个。” 第三个状态是CheckState.Indeterminate - 如果我没记错的话,复选框在处于该状态时会被填充为浅灰色。
我的猜测是它与三态复选框有关。这是 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);
}
【讨论】: