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