验证单选按钮

本文关键字:单选按钮 验证 | 更新日期: 2023-09-27 17:59:04

我在c#中编程,我的表单中有一些单选按钮,我想进行验证,确保用户选择了按钮中的所有单选按钮,所以我的方法是:

 public bool check_radiobutton(RadioButton radio1, RadioButton radio2)
        {
            //none of them aare selected
            if ((radio1.Checked) && (radio2.Checked))
            {
                return false;
            }
            else
            {
                MessageBox.Show("You forgot to select a radiobutton!");
            }
            return true;
        }

但它不起作用

验证单选按钮

对于您拥有的每一对单选按钮(或者对于每组,是/否问题是成对的)。您必须检查是否至少(实际上如果只有)选中了其中一个选项。那就是你想检查是否:

(radio1.Checked) || (radio2.Checked)

为什么?因为通过这种方式,您询问的是radio1是否已检查,还是radio2是否已检查。否则,如果您保留:

(radio1.Checked) && (radio2.Checked)

您询问的是radio1是否已检查,radio2是否已检查。不可能,这就像要求同时回答"是"answers"否"。当然,这永远不会被认为是真的,除非宇宙本身有什么问题。

根据您的评论:

//none of them aare selected

我猜你试图使用D’Morgan定律,该定律适用于本案,指出:

(radio1.Checked) || (radio2.Checked) == !((!radio1.Checked) && (!radio2.Checked))

你可以阅读这个代码:

!((!radio1.Checked) && (!radio2.Checked))

如下所示:如果为false,则表示(radio1未选中,radio2也未选中)。只有当两者都没有被选中时,这才会是错误的,当你想返回false时就是这种情况(也就是说,当计算结果为true时,你想返回true):

if (!((!radio1.Checked) && (!radio2.Checked)))
{
    return true;
}
else
{
    return false;
}

通过反转if,您最终得到:

if ((!radio1.Checked) && (!radio2.Checked))
{
    return false;
}
else
{
    return true;
}

这与你所拥有的很接近,但并不完全相同。因此,你的方法的一个拟议实现是[我把你的风格改成了我的风格]:

public bool CheckRadioButtons(RadioButton radioButtonA, RadioButton radioButtonB)
{
    //none of them are selected
    if ((!radioButtonA.Checked) && (!radioButtonB.Checked))
    {
        return false;
    }
    else
    {
        MessageBox.Show("You forgot to select a RadioButton!");
        return true;
    }
}

此外,我认为你可能想从那里取出MessageBox,你可以将方法压缩为:

public bool CheckRadioButtons(RadioButton radioButtonA, RadioButton radioButtonB)
{
    return !((!radioButtonA.Checked) && (!radio2.radioButtonB));
}

概括如下:

public bool CheckRadioButtons(params RadioButton[] radioButtons)
{
    foreach (RadioButton radioButton in radioButtons)
    {
        if (radioButton.Checked)
        {
            return true;
        }
    }
    return false;
}

如果你喜欢的话,你仍然可以在来电中显示邮箱[我认为这是一件好事,可以将这些担忧分开]。此外,如果您正在使用Linq[请记住在yout文件或命名空间块的顶部添加"using System.Linq",可用形式为.NET 3.5]:

public bool CheckRadioButtons(params RadioButton[] radioButtons)
{
    return radioButtons.Any(radioButton => radioButton.Checked);
}

考虑到这一点的简单性,您可以考虑跳过来创建一个方法。以下是如何在没有额外方法的情况下仅用两个单选按钮调用此功能:

(new RadioButton[]{radioButtonA, radioButtonB}).Any(radioButton => radioButton.Checked);

当然,对于只有两个单选按钮的简单情况来说,这是一个开销,所以有一个方法可以让你为简单情况重载它(例如2个单选按钮和3个单选按钮)。

在if语句中,您会检查是否同时选中了两个单选按钮,但这永远不会发生,因为始终打开的单选按钮都会被选中。您应该使用复选框来实现这一点,或者更改&到||以检查是否选中了租用的某个按钮。

单选按钮通常用于表示互斥的选项。复选框可以更好地表示您似乎需要的内容(多选)。

如果我尝试在表单上添加两个单选按钮,我会发现其中只有一个可以是checked(当我这样做时,另一个会自动取消选中)。

这意味着这两个单选按钮永远不会同时为checked,MessageBox将始终显示。。。

编辑:

一个容器中一次只能有一个单选按钮是checked。你可以用它来实现"A或B"answers"C或D",有两个面板,一个带有A和B的单选按钮,另一个带有C和D的单选按钮。

由于两个单选按钮都不可能被检查,因此有效状态是其中一个按钮被检查的状态。你不会用&(其为AND),但与||(其为OR)。

bool IsValid = radio1.Checked || radio2.Checked;