如何将Indeterminate CheckBox更改为Checked而不是Unchecked?

时间:2016-10-29 21:00:59

标签: c# winforms

我的CheckBox设置为CheckState.Indeterminate。当计时器到期时,它将被设置为CheckState.Unchecked并关闭外部输出信号。到目前为止一切都很好。

使用当前代码,当用户点击Indeterminate CheckBox时,它将变为Unchecked CheckBox。我想拦截它并使它成为Checked CheckBox

对用户的影响是取消计时器并保持输出打开,直到用户取消选中该框或用户启动一个单独的进程接管并再次设置Indeterminate CheckBox`。

因为它是关闭输出并且必须再次明确地打开它。

我尝试了验证活动,但在我离开此框之前不会发生这种情况。

更新1:澄清一下用户想要看到的内容。 当灯关闭时,盒子总是未经检查。

当系统的自动部分运行时,指示灯亮起。如果用户查看控件,则它处于不确定状态,因为用户没有将其激活,但它已打开。

当过程停止时,计时器启动,灯亮2分钟。在此期间,用户仍然会看到不确定状态。

如果用户需要保持亮起,他将选中删除不确定状态的框。当他通过时,他将手动取消选中关闭灯的框或重新启动自动过程,这将使其再次不确定。

我不知道 AutoCheck 属性

3 个答案:

答案 0 :(得分:2)

不需要任何激烈的东西,你只是不喜欢Checkbox实现其AutoCheck属性的方式。因此,选择控件并将其AutoCheck属性设置为False。那就让你以你想要的方式控制检查状态。

添加Click事件处理程序,以允许用户通过鼠标单击或空格键按下将状态从Indeterminate直接翻转为Checked:

{{1}}

答案 1 :(得分:1)

我建议不要改变标准控件的行为,但如果这是你需要的,你可以继承CheckBox并覆盖Onclick方法。

This是您可以看到标准行为的地方。

您需要做的就是在switch语句中重写该逻辑并调用基数。我们需要通过将AutoCheck设置为false来抑制基本的checkstate逻辑,然后将其恢复为之前的值:

public class MyCheckBox : CheckBox
{
    protected override void OnClick(EventArgs e)
    {
        if (AutoCheck)
            switch (CheckState)
            {
                case CheckState.Indeterminate:
                    CheckState = CheckState.Checked;
                    break;
                case CheckState.Unchecked:
                    if (ThreeState)
                    {
                        CheckState = CheckState.Indeterminate;
                    }
                    else
                    {
                        CheckState = CheckState.Checked;
                    }
                    break;
                default:
                    CheckState = CheckState.Unchecked;
                    break;
            }

        var oldAutoCheckValue = AutoCheck;
        AutoCheck = false;
        base.OnClick(e);
        AutoCheck = oldAutoCheckValue;
    }
}

作为替代解决方案,您应该考虑使用单选按钮来改善UX。

答案 2 :(得分:0)

我认为你需要CheckStateChanged事件。

试试这个让我知道:

//mark the process as running (check box is Indeterminate state)
private bool processIsRunning = true;

private void chkState_CheckStateChanged(object sender, EventArgs e)
{
    //the user clicks the indeterminate checkbox
    if (processIsRunning && chkState.CheckState == CheckState.Unchecked)
    {
        processIsRunning = false;
        chkState.CheckState = CheckState.Checked;
    }
}