使用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;
}
答案 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
由于仅将事件分配给单选按钮,所以未实现发送方的类型检查。
还要注意,当我们循环所有按钮时,这可能是分配数据属性,更改文本等的绝佳时机。