验证单选按钮

时间:2011-06-10 20:54:01

标签: c#

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

但它无效

3 个答案:

答案 0 :(得分:1)

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

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

为什么?因为这样你就会问是否检查了radio1,或者是否检查了radio2。否则,如果你保留:

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

您正在询问是否已选中radio1以及是否已选中radio2。这不可能,这就像请求回答“是”和“否”。当然,除非宇宙存在某种不可忽视的错误,否则永远不会评估为真。

来自你的评论:

//none of them aare selected

我猜你试图使用D'Morgan定律,适用于这种情况说:

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

您可以阅读此代码:

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

如下:如果错误(未检查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;
}

如果你愿意,你仍然可以在调用者中显示messegebox [我认为这是一个将这些问题分开的好事]。此外,如果您使用Linq [Remeber在您的文件或命名空间块的顶部添加“使用System.Linq”,可用的形式.NET 3.5]:

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

鉴于此简单,您可以考虑跳过为此创建一个方法。以下是如何在没有其他方法的情况下使用两个RadioButton调用此方法:

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

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

答案 1 :(得分:0)

单选按钮通常用于表示互斥的选项。复选框更能代表您的需求(多种选择)。

如果我尝试在表单上添加两个单选按钮,我看到其中只有一个可以checked(另一个在我执行此操作时会自动取消选中)。

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

编辑:

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

由于既不能检查单选按钮,也可以检查其中一个按钮的有效状态。你不要用&&amp ;;来检查(这是AND)但是|| (这是OR)。

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

答案 2 :(得分:0)

在你的if语句中,你检查两个radiobutons是否都被选中,但这种情况永远不会发生,因为总是打开单选按钮会被检查。您应该使用复选框来实现这一点或更改&&到||检查租用的其中一个按钮是否被检查。