2011-06-10 202 views
-1

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

但它没有工作

+1

“它没有工作”是一个不好的问题描述。什么没有用?有错误吗?请阅读:http://tinyurl.com/so-hints – Oded 2011-06-10 20:56:30

+0

是你的逻辑权利?看起来你的回归真假是相反的。 – 2011-06-10 20:57:32

+1

您无法在正确设置的单选按钮中选择所有选项。在这里你正在检查'A && B',这永远不会是这样。你应该检查'A || B'为用户选择一个**或**另一个。在极端情况下,您可以检查'!A &&!B',因为应该检查其中一个。 – ChrisF 2011-06-10 20:58:27

回答

0

单选按钮通常用于表示相互排斥的选项。复选框更好地代表您似乎需要的东西(多种选择)。

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

这意味着两个单选按钮永远不会checked在同一时间和消息框会一直显示...

编辑:

只有一个容器内的一个单选按钮,可以checked一次。 您可以通过使用2个面板实现“A或B”和“C或D”,其中一个带有用于A和B的单选按钮,另一个带有用于C和D的单选按钮的面板。

因为它有可能无法检查单选按钮,有效状态是检查其中一个按钮的状态。你不检查这与& &(这是AND),但与||。 (这是OR)。

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

如果我必须使用复选框,我应该怎么做才能让用户只选择复选框的一个答案? – Sharon 2011-06-10 21:17:16

+0

@Sharon:最好你不要尝试,这是单选按钮的用途。你究竟在做什么? – Andrei 2011-06-10 21:23:06

+0

我有一个表单,其中包含我询问用户的问题,其中一些问题是表单中单选按钮显示的是/否问题。但是,在进入下一个表单之前,我必须验证没有一对单选按钮未被用户选中。 – Sharon 2011-06-10 21:33:32

0

在你的if语句,你检查这两个radiobutons进行检查,但是这永远不会发生,因为总是在单选按钮将被检查。您应该使用复选框来实现此目的,或将& &更改为||检查租用的其中一个按钮是否被选中。

1

对于每对无线电按钮(或每组,对于是/否问题)。您必须检查是否至少(实际上只有)其中一个选项被选中。那是你想检查是否:

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

为什么这样?因为这样你问的是radio1是否被选中,否则如果radio2被选中。否则,如果您保留:

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

您在询问是否选中radio1并且是否选中radio2。这不可能,就像要求回答“是”和“否”一样。当然,这永远不会被评估为真实的,除非宇宙中有某种错误。

从您的评论:

//none of them aare selected 

我猜你试图使用d”摩根定律,它适用于该情况下指出:

(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 ((!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的”在YOUT文件或命名空间块,avaliable形式.NET 3.5的顶]:

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

鉴于这个简单,你可以考虑跳过为此完全创建一个方法。这里是你怎么可能只用两个单选按钮调用此无需额外的方法:

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

当然它是简单的情况作为一个只有两个单选按钮的开销,所以有一种方法可以让你重载它简单的例子(比如2个RadioButtons和3个RadioButtons)。