2013-12-23 32 views
0

我在組框中有3個單選按鈕。我編碼了我認爲是正確的,但該事件僅適用於一個單選按鈕。例如,如果單擊rdbServiceStandard,則顯示rbServicePermanent的值爲'P',它應該顯示'S'並且有時完全不會觸發。我想我的問題是,我編碼正確,以檢索單選按鈕的值是一個groupbox。非常感謝從組框中檢索單選按鈕值

組框

gbxServiceLevel

單選按鈕

rdbServiceStandard

rbServicePermant

rdbServiceRapid

變量來保存值

rbServiceLevel

Private Sub gbxServiceLevel_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles gbxServiceLevel.Enter 
     If rdbServiceStandard.Checked Then 
      rbServiceLevel = "S" 
     ElseIf rdbServiceRapid.Checked Then 
      rbServiceLevel = "R" 
     ElseIf rdbServicePermanent.Checked Then 
      rbServiceLevel = "P" 
     End If 
     MessageBox.Show(rbServiceLevel) 
    End Sub 
+0

它是rbServicePermant還是rdbServicePermant? – DevelopmentIsMyPassion

+0

謝謝Ash。糾正。我的錯字。 – user1532468

回答

1
If CType(sender, RadioButton).Checked Then 

    Select Case Ctype(sender,radiobutton).Name 
     Case "rdbServiceStandard" 
      If rdbServiceStandard.Checked Then rbServiceLevel = "S" 
     Case "rdbServiceRapid" 
      If rdbServiceRapid.Checked Then rbServiceLevel = "R" 
     Case Else 'rdbServicePermanent 
      If rdbServicePermanent.Checked Then rbServiceLevel = "P" 
    End Select 

    MessageBox.Show(rbServiceLevel) 
End If 

問題該選項(收音機)按鈕組是否會收到CheckChanged事件兩次:一次當舊的選擇是UNCHECKED,一次是CHECKED,因此捕獲用戶選擇一個選項的行爲,當發送者狀態爲Checked時響應。沒有CHECK測試,您將獲得兩次msgbox。

您可以使用Tag屬性來縮短代碼。將eacd單選按鈕的Tag屬性設置爲相應的代碼(例如,rdbServiceStandard將爲「S」)。然後代碼就是:

' this is just to prevent 2 CType statements 
Dim thisRB As RadioButton = CType(sender, RadioButton).Checked 

If rb.Checked Then 
    rbServiceLevel = thisRB.Tag 
End If 

其次,如果I first enter the form and click the first option rdbServiceStandard, which is default, it shows 'S' which is fine:如果你要點擊第一個選項,選擇它,那麼它是不是默認 - 默認將其開出已經選擇的選項表單打開時。第三,如果第一個確實是默認的,CheckChanged事件將在表單加載時觸發,VB/NET將默認設置爲檢查。這通常不是什麼大問題 - 它只是將rbServiceLevel設置爲默認值。但是如果你在MsgBox這樣的事件中有行爲代碼,它也會運行。

+0

非常感謝Plutonix。照常營救:-) – user1532468

1

我覺得更容易操縱單選按鈕的CheckedChanged事件,而不是組合框中的輸入事件:

Private Sub RadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles rdbServiceStandard.CheckedChanged, rdbServiceRapid.CheckedChanged, rdbServicePermanent.CheckedChanged 
     Select Case Ctype(sender,radiobutton).Name 
      Case "rdbServiceStandard" 
       If rdbServiceStandard.Checked Then rbServiceLevel = "S" 
      Case "rdbServiceRapid" 
       If rdbServiceRapid.Checked Then rbServiceLevel = "R" 
      Case Else 'rdbServicePermanent 
       If rdbServicePermanent.Checked Then rbServiceLevel = "P" 
     End Select 

     MessageBox.Show(rbServiceLevel) 
    End Sub 
+0

謝謝魯本。然而,奇怪的事情正在發生。當我第一次輸入表單並點擊默認的第一個選項rdbServiceStandard時,它顯示'S',這很好,但是如果點擊下一個按鈕rdbServiceRapid,它仍然顯示'S'。 – user1532468