2013-12-23 20 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