如果一个复选框被选中,将另一个设为未选中。

5
我在表单上有两个复选框:chkBuriedchkAboveGround。我想设置这样的功能:如果一个被选中,另一个就会取消选中。我该怎么做?
我尝试了CheckChanged属性:
private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
    chkAboveGround.Checked = false;
}
private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
    chkBuried.Checked = false;
}

它可以工作,只是没有我希望的那样好。也就是说,当我勾选chkBuried,然后勾选chkAboveGround时,两个框在我再次勾选另一个框之前都会变成未勾选状态。


4
如果选项是互斥的,使用单选按钮。 - DeveloperGuo
@DeveloperGuo 在这种情况下,我想使用复选框。如果无法使用复选框完成此操作,我将返回单选按钮。 - Ben
10个回答

12

请按以下方式修改您的代码。

private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
    chkAboveGround.Checked = !chkBuried.Checked;
}
private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
    chkBuried.Checked = !chkAboveGround.Checked;
}

太好了!谢谢 Riz :) - Ben
出现了一个新的情况:如果我想取消选中两个框怎么办?目前,如果我选中其中一个,然后取消选中它,另一个框会再次被选中。 - Ben
对于新的场景,您可以修改第一个处理程序的主体,例如... chkAboveGround.Checked = (chkBuried.Checked)? false: chkAboveGround.Checked; 以及第二个处理程序的类似更改。 - Riz

5
我建议您使用check_click而不是check_changed。
        private void checkBox1_Click(object sender, EventArgs e)
        {
            checkBox2.Checked = false;
            checkBox3.Checked = false;
        }

        private void checkBox2_Click(object sender, EventArgs e)
        {
            checkBox1.Checked = false;
            checkBox3.Checked = false;
        }

        private void checkBox3_Click(object sender, EventArgs e)
        {
            checkBox1.Checked = false;
            checkBox2.Checked = false;
        }

2
你所描述的行为的原因是您正在使用 CheckedChanged 事件,这意味着当您手动设置 CheckBox 的 Checked 属性时,事件也会被触发,从而导致另一个框再次响应。
因此,以下可能会对您有所帮助:
private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
    if (chkBuried.Checked == true) {
        chkAboveGround.Checked = false;
    } else {
        chkAboveGround.Checked = true;
    }
}

private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
    if (chkAboveGround.Checked == true) {
        chkBuried.Checked = false;
    } else {
        chkBuried.Checked = true;
    }
}

更新于2020年3月29日:就功能而言,我的答案与Riz给出的答案是相同的。尽管如此,我仍然保留原始代码,因为对于新手来说,这可能会使整个情况更容易理解。如果您要在生产代码中实现类似的内容,请使用Riz的答案作为示例。


我尝试过这个方法,但不幸的是它没起作用。不过,你的解释帮助我理解了为什么我的方法无效。谢谢你,Danek。 - Ben
1
@Ben,抱歉我没有完全正确理解问题。Riz的解释非常好 :) - dnl-blkv

0

对我来说,最好的选择和最简单的方法是创建一个Click事件而不是CheckedChanged事件。这种方法适用于两个或更多复选框,并允许将它们全部取消选中。

    private void chkOne_Click(object sender, EventArgs e)
    {
        chkTwo.Checked = false;
    }

    private void chkTwo_Click(object sender, EventArgs e)
    {
        chkOne.Checked = false;
    }

0

我更喜欢单选按钮,但你可以做类似于这样的事情:

public void CheckACheckBox(Checkbox ck)
{
    foreach (Control ckb in this.Controls)
    {
       if ((ckb is CheckBox) && (ckb == ck))
          ck.Checked = true;
       else
          ck.Checked = false;
    }
}

0
List<CheckBox> groupOfCheckBoxes = new List<CheckBox>();
void InitFunction() {
    groupOfCheckBoxes.Add(checkbox1);
    groupOfCheckBoxes.Add(checkbox2);
    groupOfCheckBoxes.Add(checkbox3);
    foreach (CheckBox cb in groupOfCheckBoxes)
     cb.Click += checkbox_Click
}
void checkbox_Click(object sender, EventArgs e) 
{
 foreach (CheckBox cb in groupOfCheckBoxes) {
  cb.IsChecked = cb == sender;
 }
}

不过我建议也使用单选框。 上面的代码未经测试,可能存在一些错别字。


这取决于使用情况。如果复选框不包含在同一父级中,则需要某种方式来跟踪它们。如果组中有大量复选框列表,您只需在一个区域添加到该组即可。如果您只有两个复选框,则这已经过度了。抱歉,您确实指定了两个复选框。 - Gauthier
我能看到它的潜力,我绝不是在说这是错误的,但对于这种情况,我只有同一个表单上的两个复选框。因此对于我的情况来说,这有点过了 :) - Ben
我会选择使用DeveloperGuo的Radioboxes,因为它们可以随意进行样式设计(就像复选框一样)。此外,您不需要额外的代码来处理选中/取消选中。 - Gauthier
当我在寻找解决方案时,我遇到了这个网址:https://dev59.com/fEnSa4cB1Zd3GeqPM08t 也许这段代码还有更好的用途? - Ben

0
更好的版本,允许用户取消勾选框。
        private void chkOne_CheckedChanged(object sender, EventArgs e)
        {
            if (chkTwo.Checked == true)
            {
                chkTwo.Checked = !chkOne.Checked;
            }
        }

        private void chkTwo_CheckedChanged(object sender, EventArgs e)
        {
            if (chkOne.Checked == true)
            {
                chkOne.Checked = !chkTwo.Checked;
            }
        }

0
这对于两个未选中的复选框将起作用,因为它们已经未选中,所以更简单。
我也不得不自己这样做。
private void customer_IsCheckedChanged(object sender, EventArgs e)
{
    business.IsChecked = false;
}

private void business_IsCheckedChanged(object sender, EventArgs e)
{
    customer.IsChecked = false;
}

0
我需要在激活复选框时显示或隐藏一个表格,有两个复选框,如果我同时激活了两者,一切都正常,但是如果我试图稍后取消激活其中一个,另一个也会被取消。附注:我使用的表格的默认值为Visible=false。我得到的解决方案如下所示:
 protected void YourNameOfMethodForBothCheckBox(object sender, EventArgs e)
    {
        if (CheckBox_1.Checked == true)
        {
            Table_1.Visible = true;

            if (CheckBox_2.Checked == true)
            {
                Table_2.Visible = true;
            }
            else { Table_2.Visible = false; }


        }
        else
        {
            Table_1.Visible = false;

            if (CheckBox_2.Checked == false)
            {
                Table_2.Visible = false;
            }
            else
            {
                Table_2.Visible = true;

            }
        }

    }

0
我通常使用原始方法,通过定义两个整数来防止无限循环,当改变复选框状态时。
int guide1=0; //to set enter one time to checkbox1 event
int guide2=0; //to set enter one time to checkbox2 event
private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
 if(guide1==0)
 { 
  chkAboveGround.Checked = false;
  chkBuried.Checked = true;
    guide1=1;
    guide2=0;
  }

}
private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
if(guide2==0)
 { 
  chkBuried.Checked = false;
  chkAboveGround.Checked = true;  
    
    guide2=1;
    guide1=0;
  }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接