2011-06-10 237 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)。