If one checkbox is checked, set the other to unchecked

时光总嘲笑我的痴心妄想 提交于 2020-01-11 05:37:08

问题


I have two checkboxes on my form; chkBuried and chkAboveGround. I want to set it up so if one is checked, the other is unchecked. How can I do this?

I have tried the CheckChanged property:

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

And it works, just not as well as I hoped. That is, when I check chkBuried, then check chkAboveGround, both boxes become unchecked before I can check another one again.


回答1:


modify your code as below.

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



回答2:


I suggest you use check_click instead of 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;
        }



回答3:


The reason for the behavior you have explained is that you are using CheckedChanged event, which means that when you are setting the Checked property of a CheckBox manually, the event is also fired, causing another box to react again.

Therefore, the following might help you:

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



回答4:


I would prefer radio buttons, but you can do something like this:

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



回答5:


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

However I would suggest radio boxes as well. The code above is untested and may have some typos




回答6:


Better version, allows the user to uncheck boxes.

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



回答7:


The best option and easiest way for me was to create a Click event instead of a CheckedChanged event. This method works perfectly with two or more checkbox and allows to have them all unchecked.

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

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



回答8:


This will work for two unchecked boxes, since they are already unchecked it is simpler.
I had to do this myself also.

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

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


来源:https://stackoverflow.com/questions/22367720/if-one-checkbox-is-checked-set-the-other-to-unchecked

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!