【问题标题】:How to get a checked radio button in a groupbox? [duplicate]如何在组框中获得选中的单选按钮? [复制]
【发布时间】:2011-09-21 22:57:43
【问题描述】:

我在组框中有很多单选按钮。通常我会使用If radiobutton1.Checked = True Then单独检查每个单选按钮。

但我认为也许有一种聪明的方法可以检查在组框中选中了哪个单选按钮。有什么想法吗?

【问题讨论】:

标签: .net vb.net winforms radio-button groupbox


【解决方案1】:

试试这个

Dim rButton As RadioButton = 
        GroupBox1.Controls
       .OfType(Of RadioButton)
       .FirstOrDefault(Function(r) r.Checked = True)

这将在 GroupBox 中返回 Checked RadioButton

请注意,这是一个 LINQ 查询,您必须拥有

Imports System.Linq

如果您不这样做,您的 IDE/编译器可能会指出 OfType 不是 System.Windows.Forms.Control.ControlCollection 的成员

【讨论】:

  • Where 不是必需的,因为您也可以将 Lambda 表达式传递给 FirstOrDefault() 方法。
  • 这是一个很好的解决方案。您可以通过将 .Where 替换为 .SingleOrDefault 并删除 .FirstOrDefault 来使其更简单。
  • 这让我免于编写一个巨大的 if 语句
【解决方案2】:

如果您将它们(例如 Load 事件)添加到列表中,您可以使用 LINQ:

Dim checkedRadioButton as RadioButton
checkedRadioButton = 
    radioButtonList.FirstOrDefault(Function(radioButton) radioButton.Checked))

这应该没问题,因为最多检查一个。

编辑 更好的是:只需查询 GroupBox 的 Controls 集合:

Dim checkedRadioButton as RadioButton
checkedRadioButton = 
    groupBox.Controls.OfType(Of RadioButton)().FirstOrDefault(Function(radioButton) radioButton.Checked))

请注意,如果 Groupbox 中没有 RadioButtons,这将导致问题!

【讨论】:

  • 我认为在 vb.net 而不是 Children 你需要使用 Controls
  • 你是对的。不仅在 C# 中的 VB 中也是如此;它是一个属性名称。我正在与 WPF/Silverlight 混淆
  • “IsChecked”不是“RadioButton”的成员
【解决方案3】:
'returns which radio button is selected within GroupBox passed
Private Function WhatRadioIsSelected(ByVal grp As GroupBox) As String
    Dim rbtn As RadioButton
    Dim rbtnName As String = String.Empty
    Try
        Dim ctl As Control
        For Each ctl In grp.Controls
            If TypeOf ctl Is RadioButton Then
                rbtn = DirectCast(ctl, RadioButton)
                If rbtn.Checked Then
                    rbtnName = rbtn.Name
                    Exit For
                End If
            End If
        Next
    Catch ex As Exception
        Dim stackframe As New Diagnostics.StackFrame(1)
        Throw New Exception("An error occurred in routine, '" & stackframe.GetMethod.ReflectedType.Name & "." & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'." & Environment.NewLine & "  Message was: '" & ex.Message & "'")
    End Try
    Return rbtnName
End Function

【讨论】:

  • 其他答案更简洁一些,但这作为一种不需要控件名称的蛮力方法很有趣。
【解决方案4】:

我知道它被标记为 vb.net 但这是一个 c# 示例

var checkedButton = GroupBox1.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(rb => rb.Checked);

【讨论】:

    【解决方案5】:

    这是一个带有四个单选按钮的组合框的测试程序。

    Public Class Form1
    
        Private Sub Form1_Shown(sender As Object, _
                                e As System.EventArgs) Handles Me.Shown
            RadioButton1.Tag = New Action(AddressOf rb1Action)
            RadioButton2.Tag = New Action(AddressOf rb2Action)
            RadioButton3.Tag = New Action(AddressOf rb3Action)
            RadioButton4.Tag = New Action(AddressOf rb4Action)
        End Sub
    
        Private Sub rb1Action()
            Debug.WriteLine("1 " & RadioButton1.Checked)
        End Sub
    
        Private Sub rb2Action()
            Debug.WriteLine("2 " & RadioButton2.Checked)
        End Sub
    
        Private Sub rb3Action()
            Debug.WriteLine("3 " & RadioButton3.Checked)
        End Sub
    
        Private Sub rb4Action()
            Debug.WriteLine("4 " & RadioButton4.Checked)
        End Sub
    
        Private Sub RadioButton_CheckedChanged(sender As System.Object, _
                                                e As System.EventArgs) Handles _
                                            RadioButton1.CheckedChanged, _
                                            RadioButton2.CheckedChanged, _
                                            RadioButton3.CheckedChanged, _
                                            RadioButton4.CheckedChanged
    
            Dim aRadioButton As RadioButton = DirectCast(sender, RadioButton)
            If aRadioButton.Checked Then
                Dim rbAct As Action = DirectCast(aRadioButton.Tag, Action)
                rbAct.Invoke()
            End If
        End Sub
    End Class
    

    【讨论】:

      【解决方案6】:

      您可以运行一个 foreach 循环来迭代控件的扫描 GroupBox内的RadioButton,所以使用Control,见下例。

          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          'RadioButton checked
          Dim ceckedRadioButton As Integer = 0
          'Total RadioButton on GroupBox
          Dim totalRadioButton As Integer = 0
      
          'Iteration and check RadioButton selected
          For Each myControl As RadioButton In Me.GroupBox1.Controls.OfType(Of RadioButton)()
              'If RadioButton is checked
              If myControl.Checked Then
                  'increases variable ceckedRadioButton
                  ceckedRadioButton += 1
              End If
      
              'increases variable totalRadioButton
              totalRadioButton += 1
          Next
      
          If ceckedRadioButton > 0 Then
              'RadioButon show how many are selected
              MessageBox.Show("Were selected" & " " & ceckedRadioButton.ToString & " " & "RadioButton on" & " " & totalRadioButton.ToString)
          Else
              'No selected RadioButton
              MessageBox.Show("No selected RadioButton")
          End If
      End Sub
      

      再见

      【讨论】:

        【解决方案7】:

        我有一个简单又容易的

        For Each b As RadioButton In GroupBox1.Controls.OfType(Of RadioButton)()
                If b.Checked = True Then
                    MsgBox("I hope that will help you")
                End If
            Next
        

        【讨论】:

          【解决方案8】:

          有 3 个 RadioButton:RadioButton1、RadioButton2 和 RadioButton3

          'A handler for the click event of the 3 buttons is created
          Private Sub Radios_Click(sender As Object, e As EventArgs) Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click
              Dim rb As RadioButton
              rb = sender
              MsgBox(rb.Name) 'Displays the name of the selected control or that he was made the click
          End Sub
          

          【讨论】:

            【解决方案9】:

            我从表格中的项目名称创建了三个单选按钮。我还为此创建了一个事件处理程序。现在,当我尝试在 msgbox 中通过其文本值检查哪个按钮时。它显示了正确的名称,但 msgbox 弹出两次以供选择。我使用的是 VB.net 2012。

            Private Sub iButton_checked(ByVal sender As System.Object, ByVal e As System.EventArgs)
                For Each b As RadioButton In grpgodown.Controls.OfType(Of RadioButton)()
                    If b.Checked = True Then
                        MsgBox(b.Text)
                    End If
                Next
            End Sub
            

            【讨论】:

              【解决方案10】:
              Private Sub BTN_OK_Click(sender As Object, e As EventArgs) Handles BTN_OK.Click
              
                  For Each Ctrl In GroupBox1.Controls
                      If Ctrl.checked Then MsgBox(Ctrl.text) 'for show select RadioButton Check
                  Next
              

              【讨论】:

                【解决方案11】:
                Select Case True
                    RadioButton1.checked
                        'Do this action for Rad1
                    RadioButton2.checked
                        'Do this action for Rad2
                    RadioButton3.checked
                        'Do this action for rad3
                End Select
                

                【讨论】:

                • 这是一个非常暴力的尝试,与 OP 试图避免的大 if-elseif-then 块的差异很小。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-02-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多