【问题标题】:How do I get which radio button is checked from a groupbox?如何从组框中检查哪个单选按钮?
【发布时间】:2013-09-04 00:49:30
【问题描述】:

我有这些分组框:

我想根据选中的单选按钮的真实状态运行一些代码,例如:

string chk = radiobutton.nme; // Name of radio button whose checked is true
switch(chk)
{
    case "Option1":
        // Some code
        break;

    case "Option2":
        // Some code
        break;

    case "Option3":
        // Some code
        break;
}

有什么直接的方法让我只能得到选中的单选按钮的名称吗?

【问题讨论】:

标签: c# windows-forms-designer


【解决方案1】:

您可以找到所有选中的 RadioButtons,例如

var buttons = this.Controls.OfType<RadioButton>()
                           .FirstOrDefault(n => n.Checked);

还可以查看CheckedChanged 事件。

在 Checked 属性的值更改时发生。

【讨论】:

  • @Soner 我尝试使用此代码,但它提供了 ´Forms.RadioButton´ 和 ´Controls.RadioButton´ 之间的歧义错误,这是什么意思?
  • @CésarAmorim System.Windows.ControlsSystem.Windows.Forms 都有 RadioButton 类。我觉得,在你的项目中,这两个命名空间都被添加了,当你只输入它的名字时,编译器会混淆哪个命名空间属于这个RadioButton。作为一种解决方案,您可以使用它的全名来防止这种情况,例如 System.Windows.Controls.RadioButtonSystem.Windows.Forms.RadioButton
  • 对于通用 Windows 应用程序在执行此操作时遇到了一些问题,因为 Windows.UI.Xaml.Controls.Page 没有 Controls 属性,因此最好使用一些封装 WPF 元素,例如命名为 StackPanel 或 @987654334 @ 和 Children 属性:rbPanel.Children.OfType&lt;RadioButton&gt;().FirstOrDefault(r =&gt; r.IsCheked.Value);IsChecked 可以为空,因此 .Value
  • 有人能解释一下 .FirstOrDefault(n => n.Checked);请给我行吗?
  • @PaulAlexander OfType&lt;RadioButton&gt; 方法返回 IEnumerable&lt;RadioButton&gt;,这意味着 RadioButton 的可迭代集合。 FirstOrDefault 方法返回满足给定条件的第一个元素(或 default,如果找不到任何满足 that 条件的元素),在我们的例子中是 n.Checked(表示已检查) .基于单选按钮结构,它可以是 only 一个选定的项目,因此此代码完全符合 OP 的要求。有关更多信息,请查看 MSDN 中的 Enumerable 类:docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable
【解决方案2】:
groupbox1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked).Name

这将获得选中单选按钮的名称。如果你以后想使用它,你可以通过存储到变量中来存储它的名称。

干杯?

【讨论】:

    【解决方案3】:

    您应该查看CheckedChanged 事件以注册相应的事件处理程序并将Checked 单选按钮状态存储在某个变量中。但是,我想在这里使用 LINQ 只是因为你只有一些 RadioButtons 这使得循环的成本可以接受:

    var checkedRadio = new []{groupBox1, groupBox2}
                       .SelectMany(g=>g.Controls.OfType<RadioButton>()
                                                .Where(r=>r.Checked))
    // Print name
    foreach(var c in checkedRadio)
       System.Diagnostics.Debug.Print(c.Name);
    

    【讨论】:

      【解决方案4】:

      使用 GroupBox 的 Validated 事件,而不是检查所有 RadioButtons。

      private void grpBox_Validated(object sender, EventArgs e)
          {
              GroupBox g = sender as GroupBox;
              var a = from RadioButton r in g.Controls where r.Checked == true select r.Name;
              strchecked = a.First();
           }
      

      【讨论】:

        【解决方案5】:

        在我看来,最好使用 RadioGroup 而不是 GroupBox。如果您使用 radioGroup,您总是可以像这样轻松找到所选项目:

        radioGroup.selectedIndex;
        

        如果您使用 Windows 窗体进行设计,我建议像这样实现 RadioGroup 行为(请注意我的代码是 Java 代码):

        for (Component comp:groupBox1.components) {
            if (((RadioButton)comp).selected)
                return ((RadioButton)comp).value;
        }
        

        您可以将此代码块放在一个方法中以返回选定的 radioButton 值,然后您可以在 SWITCH 部分中使用此值。

        【讨论】:

        • 我用的是windows窗体,没有radio组选项
        猜你喜欢
        • 2011-10-04
        • 2012-04-17
        • 1970-01-01
        • 2022-07-20
        • 2016-02-01
        • 2022-09-22
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多