组中的哪个单选button被选中?

使用WinForms; 有没有更好的方法来find一个组的选中的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; } 

你可以使用LINQ:

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

请注意,这要求所有单选button都直接放在同一个容器中(例如Panel或Form),并且容器中只有一个组。 如果不是这种情况,你可以在你的构造函数中为每个组创buildList<RadioButton> ,然后编写list.FirstOrDefault(r => r.Checked)

您可以将所有button的CheckedEvents与一个处理程序连接起来。 在那里你可以很容易地得到正确的checkbox。

 // 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; } } 

对于那些没有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; } 

OP想要得到选中的RadioButton BY GROUP。 虽然@SLaks的答案非常好,但它并没有真正回答OP的主要问题。 为了改进@SLaks的答案,只需要LINQ更进一步。

这是我自己的工作代码的一个例子。 每个正常的WPF,我的RadioButtons包含在一个网格(名为“myGrid”)与一堆其他types的控件。 网格中有两个不同的RadioButton组。

从特定的组中获取选中的RadioButton:

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

如果你的代码有可能没有选中RadioButtons,那么使用“SingleOrDefault()”。 (如果我不使用三态button,那么我总是设置一个button“IsChecked”作为默认select。)

您可以为所有的RadioButton使用CheckedChanged事件。 Sender将是unchecked和检查RadioButtons。

您可以使用扩展方法迭代RadioButton的Parent.Controls集合。 这使您可以查询同一范围内的其他RadioButtons。 使用两种扩展方法,可以使用第一种方法确定组中的任何RadioButton是否被选中,然后使用第二种方法来获取select。 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; 

有时在这样的情况下,我想念我的青春,当Access是我select的毒药时,我可以给每个单选button一个自己的价值。

我在C#中的破解是使用标签来设置值,当我从组中进行select时,我读取所选单选button的标签的值。 在这个例子中, directionGroup是我有四个五个单选button的组,其中“None”和“NE”,“SE”,“NW”和“SW”作为另外四个单选button上的标签。

我主动地使用一个button来捕获选中的button的值,因为由于将一个事件处理程序分配给所有button的CHeckCHanged事件会导致EACHbutton触发,因为更改一个button会将其全部更改。 所以发件人的值始终是组中的第一个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()); } 

仅供参考,我已经在我的工作中进行了testing和使用。

乔伊

如果你想把select保存到文件或其他任何地方,稍后调用它,在这里我做什么

 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; 

除了CheckedChangedEvent接线之外,还可以使用控件“标记”属性来区分单选button…一个(意大利面代码)替代scheme将是“TabIndex”属性; P

如果你想获得控件中所选单选button的索引,你可以使用这个方法:

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

代码没有得到很好的testing,但是看起来索引顺序是从左到右,从上到下,就像阅读文本一样。 如果找不到单选button,则该方法返回-1。

更新:原来我的第一次尝试没有工作,如果没有单选button内的控制。 我添加了一个try和catch块来解决这个问题,现在这个方法似乎可行了。