如果选中一个复选框,请将另一个复选框设置为取消选中

问题描述 投票:0回答:10

我的表单上有两个复选框;

chkBuried
chkAboveGround
我想将其设置为如果选中一个,则取消选中另一个。我怎样才能做到这一点?

我尝试过

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
时,在我再次选中另一个框之前,这两个框都会变为未选中状态。

c# winforms checkbox
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;
}

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 的答案作为示例


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;
 }
}

但是我也建议使用无线电盒。 上面的代码未经测试,可能有一些错别字


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
投票

对我来说最好的选择和最简单的方法是创建 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
投票

这适用于两个未选中的框,因为它们已经未选中,所以更简单。
我也必须自己做。

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

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

0
投票

我需要在激活复选框时显示或不显示表格,它们是两个,如果我激活两个,一切都很好,但如果我稍后尝试停用一个,另一个也被停用。 PD:我使用的表的默认值是 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
投票

i'v 原始方法通常通过定义 2 个引导整数来防止 更改复选框状态时无限循环:

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;
  }   
}
© www.soinside.com 2019 - 2024. All rights reserved.