Windows窗体'CheckBox
控件实现了CheckedChanged
和CheckStateChanged
个事件。据我所知,当复选框的选中状态发生变化时,两者都会触发。
CheckedChanged
在CheckStateChanged
之前,但除此之外我没有看到任何区别。我错过了什么吗?一个人应该优先于另一个吗?
答案 0 :(得分:59)
CheckState(以及CheckStateChanged)允许使用一个可以包含三个值的复选框:可以选中,取消选中或“不确定” - 即将ThreeState设置为true。
如果你没有使用ThreeState,那么就是你需要的CheckedChanged。
答案 1 :(得分:20)
我的猜测是它与三态复选框有关。这是CheckState setter的胆量:
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);
}
答案 2 :(得分:7)
除非您将ThreeState
属性设置为true
,否则这两个事件实际上是相同的。如果没有设置ThreeState
,则在选中或取消选中复选框时将触发两者,并且在值更改后两者都将触发。
主要区别在于您将ThreeState
设置为true,这会添加Indeterminate
CheckState
:
Indeterminate
为"已检查"。 (Checked == true
)。Checked
和Unchecked
之间的转换与之前相同。 Checked
和Indeterminate
之间的转换会导致 触发CheckedChanged
事件,因为Checked
会停留true
。Unchecked
和Indeterminate
之间转换会触发CheckedChanged
事件,因为Checked
从false
更改为{{1}反之亦然。true
转换为Unchecked
到Checked
并返回Indeterminate
。您仍然可以通过编程方式从Unchecked
过渡到Unchecked
。(注意Indeterminate
属性(两状态布尔属性)与Checked
状态之间的差异,Checked
属性是CheckState
属性的三个可能值之一。 )
TL; DR:主要的实际区别在于CheckedChanged
事件在从CheckState.Checked
转换为CheckState.Indeterminate
时反对三态复选框,反之亦然,因为两个州都被认为是被检查的(Checked == true
)。
答案 3 :(得分:2)
据我所知:
在检查的值发生更改之前, CheckChanged
被触发,因此.Checked
返回值WAS,
CheckStateChanged
被触发,因此.Checked
返回值IS
答案 4 :(得分:0)
不是对该问题的正式回答,而是更多的后续评论。
我想在单击 CheckBox 时触发 2 个事件。在设计器文件中,我可以复制将事件添加到 CheckedChanged 的行,但是一旦我在设计屏幕中修改某些内容,只会保留第一个事件。
我的解决方案是在 CheckedChanged 中添加一个事件,在 CheckStateChanged 中添加另一个事件。现在,单击 CheckBox 时会触发这两个事件。
答案 5 :(得分:-2)
CheckState在提交新值之前触发。 提交新值后,将触发CheckStateChanged。
如果您在修改复选框值后查找dataset.haschanges进行更新,则需要使用checkstatechanged事件。只需确保禁用threestate以防止出现NULL问题。