我在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;
}
但它无效
答案 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是否都被选中,但这种情况永远不会发生,因为总是打开单选按钮会被检查。您应该使用复选框来实现这一点或更改&&到||检查租用的其中一个按钮是否被检查。