自定义 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);
}
}
我通过覆盖默认的 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);
}
}