C# 优化检索相关组框中选中的单选按钮

C# 优化检索相关组框中选中的单选按钮,c#,winforms,.net-4.0,C#,Winforms,.net 4.0,总之,我有一个带有多个控件(Buttons、RadioButtons等)的GroupBox,我想知道确定GroupBox中哪个RadioButton处于选中状态的最有效方法。我现在有 int nCheckedRadioIdx = 0; foreach (Control ctrl in groupBoxList.Controls) { if (ctrl.GetType() == typeof(RadioButton)) { if (((RadioButton)ctr

总之,我有一个带有多个控件(
Button
s、
RadioButton
s等)的
GroupBox
,我想知道确定
GroupBox
中哪个
RadioButton
处于选中状态的最有效方法。我现在有

int nCheckedRadioIdx = 0;
foreach (Control ctrl in groupBoxList.Controls)
{
    if (ctrl.GetType() == typeof(RadioButton))
    {
        if (((RadioButton)ctrl).Checked)
        {
            switch (((RadioButton)ctrl).Name)
            { 
                case "radioButtonGoodCodeSumm":
                    nCheckedRadioIdx = 0;
                    break;
                case "radioButtonBadCodeSumm":
                    nCheckedRadioIdx = 1;
                    break;
                case "radioButtonBadByEpiNo":
                    nCheckedRadioIdx = 2;
                    break;
                case "radioButtonValidCodes":
                    nCheckedRadioIdx = 3;
                    break;
                default:
                    break;
            }
            break;
        }
    }
}

然后我使用一个枚举器来确定我需要哪个按钮。这对我来说似乎非常冗长(事实上非常丑陋!)。我曾在VB中看到过使用某种LINQ查询来实现这一点,但我从未使用过VB或LINQ,并且正在努力进行转换。如果有更好的方法,因为其中一个
GroupBox
s包含大量的
RadioButton
s-如果可能的话,我想使用LINQ来实现这一点?

假设您有,对于每个RadioButton相同的事件处理程序,选中按钮后,将GroupBox的标记属性设置为RadioButton的标记。在设计时,可以将RadioButton的标记设置为指定的枚举值。当您希望检索选中按钮时,您只需读取Tag属性,而无需通过循环(优雅或更少)来检查GroupBox中的每个控件

例如:

private void RadioButton_Checked(oject sender, EventArgs e)
{
    RadioButton radio = ((RadioButton)sender);
    if(radio.Checked)
        groupBoxList.Tag = radio.Tag;
}

当然,这会很有效,但您应该确保很好地记录这一点,因为枚举更改中的更改将产生问题。

假设您对每个radiobutton都有相同的事件处理程序,当选中按钮时,将GroupBox的标记属性设置为radiobutton的标记。在设计时,可以将RadioButton的标记设置为指定的枚举值。当您希望检索选中按钮时,您只需读取Tag属性,而无需通过循环(优雅或更少)来检查GroupBox中的每个控件

foreach (var control in groupBox3.Controls)
{                
    RadioButton radio = control as RadioButton;

    if (radio != null && radio.Checked)
    {
        var a = radio.Name;   //it gives the name of radio button is checked
    }
}
例如:

private void RadioButton_Checked(oject sender, EventArgs e)
{
    RadioButton radio = ((RadioButton)sender);
    if(radio.Checked)
        groupBoxList.Tag = radio.Tag;
}

当然,这会很有效,但您应该确保很好地记录这一点,因为枚举更改中的更改将产生问题。

将该VB.NET代码直接翻译为C#将类似于:
RadioButton rButton=GroupBox1.Controls.OfType.Where(r=>r.Checked==true.FirstOrDefault()谢谢。但是,这种转换并不十分有效……将VB.NET代码直接转换为C#可能类似于:
RadioButton rButton=GroupBox1.Controls.OfType.Where(r=>r.Checked==true.FirstOrDefault()谢谢。然而,这个翻译不是很有效…+1谢谢你的好主意。然而,我想使用LINQ。为了好玩!:]@Killercam,我也喜欢LINQ,但在这种情况下它似乎效率很低。我想为每个
RadioButton
添加此事件处理程序。这里的交易是什么?谢谢你的时间……也许我没有把我的意图拼对。我认为对所有单选按钮使用一个事件处理程序。我是说相同的事件处理程序!更新答案。+1谢谢,好主意。然而,我想使用LINQ。为了好玩!:]@Killercam,我也喜欢LINQ,但在这种情况下它似乎效率很低。我想为每个
RadioButton
添加此事件处理程序。这里的交易是什么?谢谢你的时间……也许我没有把我的意图拼对。我认为对所有单选按钮使用一个事件处理程序。我是说相同的事件处理程序!更新答案。
foreach (var control in groupBox3.Controls)
{                
    RadioButton radio = control as RadioButton;

    if (radio != null && radio.Checked)
    {
        var a = radio.Name;   //it gives the name of radio button is checked
    }
}