【发布时间】: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