我的表单上有两个复选框;
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
时,在我再次选中另一个框之前,这两个框都会变为未选中状态。
修改您的代码如下。
private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
chkAboveGround.Checked = !chkBuried.Checked;
}
private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
chkBuried.Checked = !chkAboveGround.Checked;
}
我建议你使用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;
}
您所解释的行为的原因是您正在使用
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 的答案作为示例。
我更喜欢单选按钮,但你可以这样做:
public void CheckACheckBox(Checkbox ck)
{
foreach (Control ckb in this.Controls)
{
if ((ckb is CheckBox) && (ckb == ck))
ck.Checked = true;
else
ck.Checked = false;
}
}
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;
}
}
但是我也建议使用无线电盒。 上面的代码未经测试,可能有一些错别字
更好的版本,允许用户取消选中复选框。
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;
}
}
对我来说最好的选择和最简单的方法是创建 Click 事件而不是 CheckedChanged 事件。 此方法与两个或多个复选框完美配合,并允许将它们全部取消选中。
private void chkOne_Click(object sender, EventArgs e)
{
chkTwo.Checked = false;
}
private void chkTwo_Click(object sender, EventArgs e)
{
chkOne.Checked = false;
}
这适用于两个未选中的框,因为它们已经未选中,所以更简单。
我也必须自己做。
private void customer_IsCheckedChanged(object sender, EventArgs e)
{
business.IsChecked = false;
}
private void business_IsCheckedChanged(object sender, EventArgs e)
{
customer.IsChecked = false;
}
我需要在激活复选框时显示或不显示表格,它们是两个,如果我激活两个,一切都很好,但如果我稍后尝试停用一个,另一个也被停用。 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;
}
}
}
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;
}
}