【问题标题】:Custom ThreeState CheckBox not working with Click trigger event自定义 ThreeState CheckBox 不适用于 Click 触发事件
【发布时间】:2022-01-25 13:30:13
【问题描述】:

我通过覆盖默认的 CheckBox 控件制作了自己的 MyCheckBox 控件。原因是我想在 ThreeState 属性设置为 true 时更改其状态的顺序。

默认顺序是

UnChecked -> Checked -> Indeterminate -> Unchecked -> .....(重复)

我希望订单是这样的

UnChecked -> Indeterminate -> Checked -> Unchecked -> .....(重复)

下面是实现它的代码。

    public class MyCheckBox : CheckBox
    {
        protected override void OnClick(EventArgs e)
        {
            if (AutoCheck)
            {
                if (CheckState == CheckState.Indeterminate)
                {
                    CheckState = CheckState.Checked;
                }
                else if (CheckState == CheckState.Checked)
                {
                    CheckState = CheckState.Unchecked;
                }
                else
                {
                    CheckState = ThreeState ? CheckState.Indeterminate : CheckState.Checked;
                }
            }
        }
    }

直到这里一切正常,当我启用它的 Click 触发事件时问题就开始了。

Click 事件未触发。

我回到 CheckBox OnClick() 看看我是否遗漏了什么。这是我用上面提到的代码覆盖的代码。

        protected override void OnClick(EventArgs e)
        {
            if (autoCheck)
            {
                switch (CheckState)
                {
                    case CheckState.Unchecked:
                        CheckState = CheckState.Checked;
                        break;
                    case CheckState.Checked:
                        if (threeState)
                        {
                            CheckState = CheckState.Indeterminate;
                            if (AccObjDoDefaultAction)
                            {
                                AccessibilityNotifyClients(AccessibleEvents.StateChange, -1);
                            }
                        }
                        else
                        {
                            CheckState = CheckState.Unchecked;
                        }

                        break;
                    default:
                        CheckState = CheckState.Unchecked;
                        break;
                }
            }

            base.OnClick(e);
        }

我当然错过了 base.OnClick(e) 方法,但是一旦我将此方法添加到我的 MyCheckBox OnClick() ,现在 Click 事件触发正常,但 MyCheckBox 的 CheckState 卡在 Unchecked。 无论我点击多少次,它都卡在 Unchecked 并且不会改变。

我花了几个小时弄清楚发生了什么,但没有运气。

经过进一步调试,我发现 CheckState 确实发生了变化(如果我在 Click 触发事件触发之前暂停程序可以看到它),但在 Click 事件结束后,CheckState 恢复为 UnChecked .

任何人都可以解决这个问题吗?我放弃了。

我在 .net winforms 上。

【问题讨论】:

    标签: c# .net winforms checkbox threestate


    【解决方案1】:

    通过将 MyCheckBox 的 AutoCheck 属性设置为 false 并使用以下代码,一切都按预期工作。

        public class MyCheckBox : CheckBox
        {
            protected override void OnClick(EventArgs e)
            {
                if (CheckState == CheckState.Indeterminate)
                {
                    CheckState = CheckState.Checked;
                }
                else if (CheckState == CheckState.Checked)
                {
                    CheckState = CheckState.Unchecked;
                }
                else
                {
                    CheckState = ThreeState ? CheckState.Indeterminate : CheckState.Checked;
                }
    
                base.OnClick(e);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2016-04-16
      • 2015-07-06
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多