首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义ThreeState CheckBox不使用单击触发器事件

自定义ThreeState CheckBox不使用单击触发器事件
EN

Stack Overflow用户
提问于 2022-01-25 03:25:54
回答 1查看 55关注 0票数 0

我通过重写默认的MyCheckBox控件来创建自己的CheckBox控件。原因是,当它的ThreeState属性设置为true时,我想更改它的状态顺序。

默认顺序是

UnChecked ->检查->不确定->未检查-> .(重复)

我希望命令就像

UnChecked ->不确定->检查->未检查-> .(重复)

下面是实现这一目标的代码。

代码语言:javascript
复制
    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事件不开火。

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

代码语言:javascript
复制
        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事件就可以启动了,但是CheckState of MyCheckBox仍然是不受控制的。不管我点击多少次它都没有被选中,也不会改变。

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

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

有人能搞清楚吗?投降了。

我在.net winforms上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-25 05:30:13

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

代码语言:javascript
复制
    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);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70843092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档