如何重置复选框值

时间:2015-11-20 00:25:48

标签: c#

我有一个表单显示复选框,它们是空的。

当我选择其中一个时,我想检查另一个是否已被选中,如果是,我想关闭复选标记。

我试过这段代码:

private void active_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (inactive_checkbox.Checked)
        inactive_checkbox.Checked = false;
}

private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (active_checkbox.Checked)
        active_checkbox.Checked = false;
}

但是当我选择“非活动”和“活动”时,复选标记将从两个复选框中消失。

3 个答案:

答案 0 :(得分:1)

当您单击该复选框时,会发生以下情况:

  1. 该复选框的CheckedChanged触发
  2. 取消选中其他复选框
  3. CheckedChanged用于其他复选框触发
  4. 取消选中第一个复选框。
  5. 您需要检查更改是由代码还是用户输入引起的。这是一种方法:

    bool codeChecking;
    
    private void active_checkbox_CheckedChanged(object sender, EventArgs e)
    {
        if (codeChecking)
            return;
    
        try  
        {
            codeChecking = true;
            if (inactive_checkbox.Checked)
                inactive_checkbox.Checked = false;
        }
        finally 
        {
            codeChecking = false;
        }
    }
    
    private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
    {
        if (codeChecking)
            return;         
    
        try  
        {
            codeChecking = true;
            if (active_checkbox.Checked)
                active_checkbox.Checked = false;
        }
        finally 
        {
            codeChecking = false;
        }       
    }
    

    我将try..finally放在那里,因为在处理程序抛出异常的情况下,如果codeChecking = false不在finally块中,它将使您的应用程序处于不可能的状态选中任一复选框。

答案 1 :(得分:0)

  

当我选择其中一个时,我想检查另一个是否已被选中,如果是,我想关闭复选标记

您是否要从刚刚检查过的复选框或另一个复选框中关闭复选标记,这似乎并不明显。由于我还没有足够的声誉要求澄清评论,我将提供两种解决方案。

如果你想取消选中另一个复选框(这对我来说更有意义),这段代码可以解决这个问题:

private void active_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (active_checkbox.Checked)
        inactive_checkbox.Checked = false;
}

private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (inactive_checkbox.Checked)
        active_checkbox.Checked = false;
}

如果您想取消选中刚刚检查过的复选框...

private void active_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (inactive_checkbox.Checked)
        active_checkbox.Checked=false;
}

private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (active_checkbox.Checked)
        inactive_checkbox.Checked=false;
}

这应该可以解决问题。但是,我可以建议只选择禁用另一个复选框,同时检查另一个复选框吗?这应该有助于避免让用户感到困惑:

private void active_checkbox_CheckedChanged(object sender, EventArgs e)
{
    inactive_checkbox.Enabled=!active_checkbox.Checked;
}

private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
{
    active_checkbox.Enabled=!inactive_checkbox.Checked;
}

这三个解决方案都很简单,可扩展,不会创建任何额外的全局变量,并且能够利用复选框相对于无线电按钮的优势 - 能够不加控制地保留它们。

希望有所帮助!

答案 2 :(得分:0)

你的逻辑只是略有错误。你需要这个:

private void active_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (active_checkbox.Checked)
        inactive_checkbox.Checked = false;
}

private void inactive_checkbox_CheckedChanged(object sender, EventArgs e)
{
    if (inactive_checkbox.Checked)
        active_checkbox.Checked = false;
}

您只需要检查是否选中了当前更改的复选框,取消选中另一个复选框。简单。