【问题标题】:Windows Forms' CheckBox CheckedChanged vs. CheckStateChangedWindows 窗体的 CheckBox CheckedChanged 与 CheckStateChanged
【发布时间】:2011-02-16 11:24:54
【问题描述】:

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

CheckedChangedCheckStateChanged 之前,但除此之外我看不出有什么区别。我错过了什么吗?是否应该优先于另一个?

【问题讨论】:

    标签: .net winforms events controls


    【解决方案1】:

    不是对这个问题的官方回答,而是更多的后续评论。

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

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

    【讨论】:

      【解决方案2】:

      除非您将ThreeState 属性设置为true,否则这两个事件实际上是相同的。在没有设置ThreeState 的情况下,当复选框被选中或取消选中时,两者都会触发,并且都会在值更改后触发。

      主要区别在于您将ThreeState 设置为true 时,会添加Indeterminate CheckState

      • 控件将Indeterminate 视为“已检查”。 (Checked == true)。
      • CheckedUnchecked 之间的转换与以前相同。
      • CheckedIndeterminate 之间的转换不会触发CheckedChanged 事件,因为Checked 保持true
      • UncheckedIndeterminate 之间转换确实会触发CheckedChanged 事件,因为Checkedfalse 更改为true,反之亦然。
      • 单击三状态复选框,状态从Unchecked 转换为Checked 再转换为Indeterminate 并返回Unchecked。您仍然可以通过编程方式从 Unchecked 转换到 Indeterminate

      (注意Checked 属性和Checked 状态之间的区别,CheckedCheckState 属性的三个可能值之一。)

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

      【讨论】:

        【解决方案3】:

        据我所知:

        CheckChanged 在检查值更改之前被触发,因此.Checked 返回值 WAS,

        CheckStateChanged 在检查值更改后被触发,所以.Checked返回值是什么

        【讨论】:

        • 这是错误的,这两个事件都会在值更改后触发。
        【解决方案4】:

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

        如果您在复选框值修改后寻找 dataset.haschanges 进行更新,您需要使用 checkstatechanged 事件。只需确保禁用三态以避免 NULL 进入那里的问题。

        【讨论】:

        • 这是错误的,这两个事件都会在值更改后触发。
        【解决方案5】:

        CheckState(因此 CheckStateChanged)允许使用可以具有三个值的复选框:它可以被选中、未选中或“不确定” - 即它将 ThreeState 设置为 true。

        如果您不使用 ThreeState,那么您只需要 CheckedChanged。

        【讨论】:

        • 这是真的!很简单,2 步(选中、未选中)使用 CheckedChanged,3 步(选中、未选中、不确定)使用 CheckStateChanged
        • 什么是indeterminate ???复选框要么未选中,要么选中,那么indeterminate 是什么?
        • 查看答案中关于ThreeState 属性的链接 - "[ThreeState] 获取或设置一个值,该值指示 CheckBox 是否允许 三个检查状态 而不是超过两个。” 第三个状态是CheckState.Indeterminate - 如果我没记错的话,复选框在处于该状态时会被填充为浅灰色。
        【解决方案6】:

        我的猜测是它与三态复选框有关。这是 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);
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          • 2020-04-08
          • 2021-04-21
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多