检查组中的哪个单选按钮?

时间:2009-11-25 15:57:49

标签: c# .net winforms radio-button

使用WinForms;有没有更好的方法来找到一个组的已检查RadioButton?在我看来,下面的代码不应该是必要的。当你检查一个不同的RadioButton然后它知道哪一个取消选中...所以它应该知道哪个被检查。如何在不执行大量if语句(或切换)的情况下提取该信息。

     RadioButton rb = null;

     if (m_RadioButton1.Checked == true)
     {
        rb = m_RadioButton1;
     }
     else if (m_RadioButton2.Checked == true)
     {
        rb = m_RadioButton2;
     }
     else if (m_RadioButton3.Checked == true)
     {
        rb = m_RadioButton3;
     }

13 个答案:

答案 0 :(得分:208)

您可以使用LINQ:

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);

请注意,这要求所有单选按钮直接位于同一容器中(例如,Panel或Form),并且容器中只有一个组。如果不是这样,您可以在每个组的构造函数中创建List<RadioButton>,然后编写list.FirstOrDefault(r => r.Checked)

答案 1 :(得分:32)

您可以将所有按钮的CheckedEvents连接到一个处理程序。在那里,您可以轻松获得正确的复选框。

// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
    // Check of the raiser of the event is a checked Checkbox.
    // Of course we also need to to cast it first.
    if (((RadioButton)sender).Checked) {
        // This is the correct control.
        RadioButton rb = (RadioButton)sender;
    }
}

答案 2 :(得分:26)

对于没有LINQ的人:

RadioButton GetCheckedRadio(Control container)
{
    foreach (var control in container.Controls)
    {
        RadioButton radio = control as RadioButton;

        if (radio != null && radio.Checked)
        {
            return radio;
        }
    }

    return null;
}

答案 3 :(得分:10)

OP希望获得经过检查的RadioButton BY GROUP。虽然@SLaks的答案非常好,但它并没有真正回答OP的主要问题。要改进@SLaks的答案,只需将LINQ更进一步。

这是我自己的工作代码的一个例子。根据普通的WPF,我的RadioButton包含在Grid(名为“myGrid”)中,其中包含许多其他类型的控件。我在Grid中有两个不同的RadioButton组。

要从特定组中获取已检查的RadioButton:

List<RadioButton> radioButtons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();

如果你的代码有可能没有选中RadioButtons,那么使用SingleOrDefault()(如果我没有使用三态按钮,那么我总是将一个按钮“IsChecked”设置为默认选择。)< / p>

答案 4 :(得分:5)

您可以对所有单选按钮使用CheckedChanged事件。 Sender将是未选中且已检查的单选按钮。

答案 5 :(得分:1)

您可以使用Extension方法迭代RadioButton的Parent.Controls集合。这允许您查询同一范围内的其他RadioButton。使用两种扩展方法,您可以使用第一种方法确定是否选择了组中的任何RadioButtons,然后使用第二种方法获取选择。 RadioButton Tag字段可用于保存Enum以识别组中的每个RadioButton:

    public static int GetRadioSelection(this RadioButton rb, int Default = -1) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return Int32.Parse((string)r.Tag);
        }
        return Default;
    }

    public static bool IsRadioSelected(this RadioButton rb) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return true;
        }
        return false;
    }

这是一个典型的使用模式:

if(!MyRadioButton.IsRadioSelected()) {
   MessageBox.Show("No radio selected.");
   return;
}
int selection = MyRadioButton.GetRadioSelection;

答案 6 :(得分:1)

除了CheckedChangedEvent接线之外,可以使用Controls“Tag”属性来区分单选按钮......(意大利面条代码)替代方案将是“TabIndex”属性; P

答案 7 :(得分:1)

有时在这样的情况下,我想念我的青春,当Access是我选择的毒药时,我可以给一组中的每个单选按钮赋予它自己的价值。

我在C#中的黑客是使用标签来设置值,当我从组中进行选择时,我会读取所选单选按钮的标签值。在此示例中, directionGroup 是我有四个五个单选按钮的组,其中&#34;无&#34;和&#34; NE&#34;,&#34; SE&#34;,&#34; NW&#34;和&#34; SW&#34;作为其他四个radiobuttons上的标签。

我主动使用按钮来捕获已选中按钮的值,因为因为为所有按钮分配了一个事件处理程序&#39; CHeckCHanged事件导致EACH按钮触发,因为更改一个按钮会更改所有按钮。因此,sender的值始终是组中的第一个RadioButton。相反,当我需要找出哪个被选中时,我使用这个方法,我想要在每个RadioButton的Tag属性中检索值。

  private void ShowSelectedRadioButton()
    {
        List<RadioButton> buttons = new List<RadioButton>();
        string selectedTag = "No selection";
        foreach (Control c in directionGroup.Controls)
        {
            if (c.GetType() == typeof(RadioButton))
            {
                buttons.Add((RadioButton)c);
            }
        }
        var selectedRb = (from rb in buttons where rb.Checked == true select rb).FirstOrDefault();
        if (selectedRb!=null)
        {
             selectedTag = selectedRb.Tag.ToString();
        }

        FormattableString result = $"Selected Radio button tag ={selectedTag}";
        MessageBox.Show(result.ToString());
    }

仅供参考,我已经在我的工作中测试并使用了它。

乔伊

答案 8 :(得分:0)

如果你想将选择保存到文件或其他任何内容并稍后调用,这就是我的工作

string[] lines = new string[1];

lines[0]  = groupBoxTes.Controls.OfType<RadioButton>()
            .FirstOrDefault(r => r.Checked).Text;

File.WriteAllLines("Config.ini", lines);

然后用

调用它
string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;

答案 9 :(得分:0)

如果要获取控件中所选单选按钮的索引,可以使用此方法:

public static int getCheckedRadioButton(Control c)
{
    int i;
    try
    {
        Control.ControlCollection cc = c.Controls;
        for (i = 0; i < cc.Count; i++)
        {
            RadioButton rb = cc[i] as RadioButton;
            if (rb.Checked)
            {
                return i;
            }
        }
    }
    catch
    {
        i = -1;
    }
    return i;
}

使用示例:

int index = getCheckedRadioButton(panel1);

代码没有经过良好测试,但似乎索引顺序是从左到右,从上到下,就像读取文本时一样。如果未找到单选按钮,则该方法返回-1。

更新:事实证明,如果控件内没有单选按钮,我的第一次尝试无效。我添加了一个try和catch块来修复它,现在这个方法似乎有效。

答案 10 :(得分:0)

如果您使用的是WinForms,则GroupBox有一个Validated事件。

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();
     }

答案 11 :(得分:0)

对于使用VB.NET的开发人员


Private Function GetCheckedRadio(container) As RadioButton
    For Each control In container.Children
        Dim radio As RadioButton = TryCast(control, RadioButton)

        If radio IsNot Nothing AndAlso radio.IsChecked Then
            Return radio
        End If
    Next

    Return Nothing
End Function

答案 12 :(得分:0)

再试一次-使用事件lambda表达式

在窗体初始化时,可以将单个事件处理程序分配给组框中的所有 RadioButton 类型的控件,并使用.tabIndex或.tag属性来标识在更改选项时对其进行检查。 / p>

这样,您可以一次性订阅每个单选按钮的任何事件

14

由于仅将事件分配给单选按钮,所以未实现发送方的类型检查。

还要注意,当我们循环所有按钮时,这可能是分配数据属性,更改文本等的绝佳时机。