自定义 ThreeState CheckBox 不适用于 Click 触发事件

Custom ThreeState CheckBox not working with Click trigger event

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

默认顺序是

UnChecked -> Checked -> Indeterminate -> Unchecked -> ..... (Repeats)

我想要这样的顺序

UnChecked -> Indeterminate -> Checked -> Unchecked -> ..... (Repeats)

下面是实现它的代码。

    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 卡在未选中状态。 无论我点击多少次,它都会卡住on 未选中且不会更改。

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

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

谁能解决这个问题?我放弃了。

我在 .net winforms 上。

通过将 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);
        }
    }