Windows窗体的CheckBox CheckedChanged与CheckStateChanged

时间:2010-05-06 16:07:10

标签: .net winforms events controls

Windows窗体'CheckBox控件实现了CheckedChangedCheckStateChanged个事件。据我所知,当复选框的选中状态发生变化时,两者都会触发。

CheckedChangedCheckStateChanged之前,但除此之外我没有看到任何区别。我错过了什么吗?一个人应该优先于另一个吗?

6 个答案:

答案 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)。
  • CheckedUnchecked之间的转换与之前相同。
  • CheckedIndeterminate之间的转换会导致 触发CheckedChanged事件,因为Checked会停留true
  • UncheckedIndeterminate 之间转换会触发CheckedChanged事件,因为Checkedfalse更改为{{1}反之亦然。
  • 点击三州状态复选框,状态从true转换为UncheckedChecked并返回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问题。