我有一个表单显示复选框,它们是空的。
当我选择其中一个时,我想检查另一个是否已被选中,如果是,我想关闭复选标记。
我试过这段代码:
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;
}
但是当我选择“非活动”和“活动”时,复选标记将从两个复选框中消失。
答案 0 :(得分:1)
当您单击该复选框时,会发生以下情况:
您需要检查更改是由代码还是用户输入引起的。这是一种方法:
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;
}
您只需要检查是否选中了当前更改的复选框,取消选中另一个复选框。简单。