C# 选中了组中的哪个单选按钮?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1797907/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Which Radio button in the group is checked?
提问by Billy
Using WinForms; Is there a better way to find the checked RadioButton for a group? It seems to me that the code below should not be necessary. When you check a different RadioButton then it knows which one to uncheck… so it should know which is checked. How do I pull that information without doing a lot of if statements (or a switch).
使用 WinForms;有没有更好的方法来为一个组找到选中的 RadioButton?在我看来,下面的代码应该不是必需的。当您选中不同的 RadioButton 时,它知道要取消选中哪个……所以它应该知道选中了哪个。如何在不执行大量 if 语句(或 switch)的情况下提取该信息。
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;
}
采纳答案by SLaks
You could use LINQ:
你可以使用 LINQ:
var checkedButton = container.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked);
Note that this requires that all of the radio buttons be directly in the same container (eg, Panel or Form), and that there is only one group in the container. If that is not the case, you could make List<RadioButton>
s in your constructor for each group, then write list.FirstOrDefault(r => r.Checked)
.
请注意,这要求所有单选按钮都直接位于同一个容器(例如,面板或表单)中,并且容器中只有一组。如果不是这种情况,您可以List<RadioButton>
在构造函数中为每个组创建s,然后编写list.FirstOrDefault(r => r.Checked)
.
回答by Bobby
You can wire the CheckedEventsof all the buttons against one handler. There you can easily get the correct Checkbox.
您可以针对一个处理程序连接所有按钮的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;
}
}
回答by tanascius
You can use the CheckedChangedevent for all your RadioButtons. Sender
will be the unchecked and checked RadioButtons.
您可以对所有 RadioButton使用CheckedChanged事件。Sender
将是未选中和选中的 RadioButtons。
回答by Jo?o Angelo
For those without LINQ:
对于那些没有 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;
}
回答by James McManus
You can use an Extension method to iterate the RadioButton's Parent.Controls collection. This allows you to query other RadioButtons in the same scope. Using two extension methods, you can use the first determine whether any RadioButtons in the group are selected, then use the second to get the selection. The RadioButton Tag field can be used to hold an Enum to identify each RadioButton in the group:
您可以使用扩展方法来迭代 RadioButton 的 Parent.Controls 集合。这允许您查询同一范围内的其他 RadioButton。使用两种扩展方法,您可以使用第一种来确定是否选择了组中的任何 RadioButton,然后使用第二种来获取选择。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;
}
Here's a typical use pattern:
这是一个典型的使用模式:
if(!MyRadioButton.IsRadioSelected()) {
MessageBox.Show("No radio selected.");
return;
}
int selection = MyRadioButton.GetRadioSelection;
回答by D'Hag
The OP wanted to get the checked RadioButton BY GROUP. While @SLaks' answer is excellent, it doesn't really answer the OP's main question. To improve on @SLaks' answer, just take the LINQ one step further.
OP 希望按组获得选中的 RadioButton。虽然@SLaks 的回答非常好,但它并没有真正回答 OP 的主要问题。要改进@SLaks 的回答,只需将 LINQ 更进一步。
Here's an example from my own working code. Per normal WPF, my RadioButtons are contained in a Grid
(named "myGrid") with a bunch of other types of controls. I have two different RadioButton groups in the Grid.
这是我自己的工作代码中的一个示例。对于普通的 WPF,我的 RadioButtons 包含在一个Grid
(名为“myGrid”)和一堆其他类型的控件中。我在网格中有两个不同的 RadioButton 组。
To get the checked RadioButton from a particular group:
要从特定组中获取选中的 RadioButton:
List<RadioButton> radioButtons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
.Where(r => r.GroupName == "GroupName" && r.IsChecked)
.Single();
If your code has the possibility of no RadioButtons being checked, then use SingleOrDefault()
(If I'm not using tri-state buttons, then I always set one button "IsChecked" as a default selection.)
如果您的代码可能没有选中 RadioButtons,则使用SingleOrDefault()
(如果我不使用三态按钮,那么我总是将一个按钮“IsChecked”设置为默认选择。)
回答by ewwink
if you want to save the selection to file or any else and call it later, here what I do
如果您想将选择保存到文件或任何其他文件并稍后调用,请执行以下操作
string[] lines = new string[1];
lines[0] = groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked).Text;
File.WriteAllLines("Config.ini", lines);
then call it with
然后用
string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;
回答by matsolof
If you want to get the index of the selected radio button inside a control you can use this method:
如果要获取控件内所选单选按钮的索引,可以使用以下方法:
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;
}
Example use:
使用示例:
int index = getCheckedRadioButton(panel1);
The code isn't that well tested, but it seems the index order is from left to right and from top to bottom, as when reading a text. If no radio button is found, the method returns -1.
代码没有经过很好的测试,但似乎索引顺序是从左到右和从上到下,就像阅读文本时一样。如果未找到单选按钮,则该方法返回 -1。
Update: It turned out my first attempt didn't work if there's no radio button inside the control. I added a try and catch block to fix that, and the method now seems to work.
更新:事实证明,如果控件内没有单选按钮,我的第一次尝试将不起作用。我添加了一个 try 和 catch 块来解决这个问题,现在该方法似乎有效。
回答by Binkan Salaryman
In addition to the CheckedChangedEvent wiring one could use the Controls "Tag" property to distinguish between the radio buttons... an (spaghetti code) alternative would be the "TabIndex" property ;P
除了 CheckedChangedEvent 接线之外,还可以使用 Controls“Tag”属性来区分单选按钮......(意大利面条代码)替代方法是“TabIndex”属性;P
回答by Joseph Morgan
Sometimes in situations like this I miss my youth, when Access was my poison of choice, and I could give each radio button in a group its own value.
有时在这种情况下,我会怀念我的青春,那时 Access 是我的毒药,我可以为组中的每个单选按钮赋予自己的价值。
My hack in C# is to use the tag to set the value, and when I make a selection from the group, I read the value of the tag of the selected radiobutton. In this example, directionGroupis the group in which I have four five radio buttons with "None" and "NE", "SE", "NW" and "SW" as the tags on the other four radiobuttons.
我在 C# 中的技巧是使用标签来设置值,当我从组中进行选择时,我会读取所选单选按钮的标签值。在这个例子中,directionGroup是我有四个五个单选按钮的组,其中“None”和“NE”、“SE”、“NW”和“SW”作为其他四个单选按钮上的标签。
I proactively used a button to capture the value of the checked button, because because assigning one event handler to all of the buttons' CHeckCHanged event causes EACH button to fire, because changing one changes them all. So the value of sender is always the first RadioButton in the group. Instead, I use this method when I need to find out which one is selected, with the values I want to retrieve in the Tag property of each RadioButton.
我主动使用一个按钮来捕获选中按钮的值,因为将一个事件处理程序分配给所有按钮的 CHeckCHanged 事件会导致每个按钮触发,因为更改一个会更改所有按钮。所以 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());
}
FYI, I have tested and used this in my work.
仅供参考,我已经在我的工作中测试并使用了它。
Joey
乔伊