如何取消选中其他复选框或取消选中单选按钮?

时间:2018-10-07 15:17:19

标签: c# winforms

在这种情况下,我正在研究我希望复选框中的单选按钮行为,唯一的例外是您可以取消选中该复选框,也不会保留任何选择。就我而言,没有办法取消选中单选按钮。我一直在尝试为普通复选框提供一个简单的代码,如果启用了一个复选框,它将取消选中其他复选框;如果禁用了一个复选框,则将所有复选框保持禁用状态。到目前为止,我尝试过的所有操作均未达到预期的效果,因此我将不得不询问其他人是否知道一种简单的编码方法。如果可能,最好将每个复选框作为事件。

编辑:代码

    private void checkLukitse1_MouseClick(object sender, MouseEventArgs e)
    {
        checkLukitse1.Checked = !checkLukitse1.Checked; // Invert state if clicked
        checkLukitse2.Checked = false; // Disable others
        checkLukitse3.Checked = false;
        checkLukitse4.Checked = false;
    }

编辑2:当然,其他复选框也是如此,但是每个复选框的选中状态名称不同

4 个答案:

答案 0 :(得分:0)

要整理一下代码,可以编写如下代码:

 private void checkLukitse1_MouseClick(object sender, MouseEventArgs e)
{
    UncheckEverything()
    checkLukitse1.Checked = true;
}

当然,UnckeckEverything()方法应将所有复选框的状态更改为false,然后您只需将一个复选框标记为已选中即可。这样,您将获得单选按钮的行为。

如果要允许“未选择任何选项”,您可以通过添加一个按钮来清除所有复选框(单击事件将仅调用UncheckEverything)来做到这一点,或者可以执行以下操作:

private void checkLukitse1_MouseClick(object sender, MouseEventArgs e)
{
    var previousValue = checkLukitse1.Checked;
    UncheckEverything()
    checkLukitse1.Checked = !previousValue;
}

答案 1 :(得分:0)

正如其他人所提到的,没有您的代码会有点困难。

但是,我建议在CheckedChanged事件中进行更改。我怀疑您是使用框 实际处于更改状态的框的选中状态来更改其他复选框。

您将检查当前状态,然后相应地设置复选框。

答案 2 :(得分:0)

您不应使用MouseCklick事件,而应使用CheckedChanged事件。另外,请注意,更改Checked属性的确会再次触发该事件。因此,我在启动取消检查过程时设置了标志_changing,如果已经设置则退出该过程,以防止重新进入该过程。

此外,如果将所有复选框都放在一个数组中,并且将所有复选框的CheckedChanged事件附加到一个事件处理程序,整个事情就变得容易了。

private CheckBox[] _checkBoxes;
private bool _changing;

public MyForm()
{
    InitializeComponent();
    _checkBoxes = new CheckBox[] {
        checkLukitse1, checkLukitse2, checkLukitse3, checkLukitse4
    };
}

// All check boxes attached to this event handler
private void checkLukitse_CheckedChanged(object sender, EventArgs e)
{
    var current = (CheckBox)sender;
    if (current.Checked && !_changing) {
        _changing = true;
        try {
            foreach (CheckBox other in _checkBoxes.Where(cb => cb != current)) {
                other.Checked = false;
            }
        } finally {
            _changing = false;
        }
    }
}

还请注意,如果用户未选中组合框,则我们无需执行任何操作。因此测试current.Checked

try-finally确保在任何情况下都将重置_changing标志。即使应该发生例外。

答案 3 :(得分:0)

这是一种使实际的单选按钮按所需方式运行的方法,方法是制作派生控件,我将其称为ClearableRadioButton,该控件继承自RadioButton。

一个ClearableRadioButton会在第一次单击时自行选择并取消选择所有其他按钮,就像普通的单选按钮一样。但是,如果在选择它后单击它,它将自动关闭。

只需将此类添加到您的项目中,即可构建一次,它将显示在工具箱中,并且可以像其他控件一样使用。

此示例适用于WinForms,但是您可以在WPF中执行相同的操作。它完全可以按照书面要求对我进行编译和完美工作。

using System;

namespace test_radio_buttons
{
    class ClearableRadioButton : System.Windows.Forms.RadioButton
    {
        private bool _checkedChanged = false;
        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);
            if (_checkedChanged)
                _checkedChanged = false;
            else
                base.Checked = false;
        }
        protected override void OnCheckedChanged(EventArgs e)
        {
            base.OnCheckedChanged(e);
            _checkedChanged = true;
        }
    }
}

请注意,您没有必须使用派生控件-您可以在表单中执行此操作,但是您需要对所有单选按钮分别执行此操作,否则就链接其事件处理程序。一次创建一个ClearableRadioButton并在需要的地方使用它就容易得多。

工作原理:单击特定按钮时会触发OnClick。当按钮的状态实际更改时,将触发CheckedChanged。 CheckedChanged在OnClick之前被触发,因此我只需要在调用CheckedChanged时将标志设置为true即可。

如果调用OnClick并设置了标志,则意味着必须已选中单选按钮。在那种情况下,我只需要清除标志即可。

如果调用OnClick且未设置该标志,则表示该按钮已被单击且未更改状态,仅当您单击已选中的按钮时才会发生。在这种情况下,我只设置button.Checked为false。