我通过重写默认的MyCheckBox控件来创建自己的CheckBox控件。原因是,当它的ThreeState属性设置为true时,我想更改它的状态顺序。
默认顺序是
UnChecked ->检查->不确定->未检查-> .(重复)
我希望命令就像
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事件不开火。
我回到了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事件就可以启动了,但是CheckState of MyCheckBox仍然是不受控制的。不管我点击多少次它都没有被选中,也不会改变。
我花了几个小时弄清楚到底发生了什么,但没有运气。
在进一步调试后,我发现CheckState确实发生了变化(如果我在Click触发器事件触发之前暂停程序,就可以看到它),但是在单击事件结束后,CheckState会恢复到UnChecked。
有人能搞清楚吗?投降了。
我在.net winforms上。
发布于 2022-01-25 05:30:13
通过将AutoCheck属性MyCheckBox设置为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);
}
}https://stackoverflow.com/questions/70843092
复制相似问题