C# 无线电按钮和开关
我有很多单选按钮,所以我最终得到的代码是这样的C# 无线电按钮和开关,c#,winforms,switch-statement,C#,Winforms,Switch Statement,我有很多单选按钮,所以我最终得到的代码是这样的 if (rbFrenchImp.Checked) { } else if (rbFrenchMet.Checked) { } else if (rbEnglishImp.Checked) { } else if (rbFrenchEuro.Checked) { } //etc... 所以我想知道,有没有可能使用带有单选按钮的开关盒?如果是,怎么做?您是指无线电按钮列表?如果是这样,您只需查找.SelectedValue 否则,如果你有一个单选按钮
if (rbFrenchImp.Checked)
{
}
else if (rbFrenchMet.Checked)
{
}
else if (rbEnglishImp.Checked)
{
}
else if (rbFrenchEuro.Checked)
{
}
//etc...
所以我想知道,有没有可能使用带有单选按钮的开关盒?如果是,怎么做?您是指
无线电按钮列表
?如果是这样,您只需查找.SelectedValue
否则,如果你有一个单选按钮的选择,你唯一的选择将是,是的,以某种方式循环它们。然而,我想你可能可以用a来取代你的计划,以取得某种成功。是的,你可以:
将相同的CheckChanged(或类似的)事件处理程序订阅到每个单选按钮。然后,您将一些代码放在如下位置:
RadioButton btn = sender as RadioButton;
if(btn!= null && btn.IsChecked)
{
Switch(btn.Name)
{
case "rbFrenchImpl":
break;
...
}
}
这适用于所有类型的框架。如果您使用的是ASP.NET,您可以像这样使用和切换windows窗体或wpf感觉有点粗糙,但您可以设置一个
字典,其中包含RadioButton
控件和相应方法之间的映射(无参数的void
方法,与操作
委托签名匹配):
//create a global radioCheckStatus
RadioCheckStatus radioStatus = RadioCheckStatus.none;
//declare your enum
private enum RadioCheckStatus
{
none = 0,
rbFrenchImp = 1,
rbFrenchMet = 2,
rbEnglishImp = 3,
rbFrenchEuro = 4
}
//On CheckedChanged event of your radioButtons set it to changed radioButtons enum
private void rbFrenchImp_CheckedChanged(object sender, EventArgs e)
{
radioStatus = RadioCheckStatus.rbFrenchImp;
}
// whereever you want to check the selected value
switch (radioStatus)
{
case RadioCheckStatus.rbFrenchImp:
{
break;
}
case RadioCheckStatus.rbFrenchEuro:
{
break;
}
case RadioCheckStatus.rbEnglishImp:
{
break;
}
case RadioCheckStatus.rbFrenchMet:
{
break;
}
default:
break;
}
然后,您可以很容易地为选中的单选按钮(或者按钮,如果它们在不同的组中)调用相应的方法:
以下是我找到的将带有多个单选按钮的“if语句”更改为case开关的最佳方法。使用单选按钮所需做的就是选择properties下的event选项卡,然后选择Checked事件下的radioButton\u Click。我希望这将对将来的人有所帮助
private void radioButton_Click(object sender, RoutedEventArgs e)
{
RadioButton radioBtn = (RadioButton)sender;
if (radioBtn.IsChecked == true)
{
switch (radioBtn.Name)
{
case "radioBtnName1":
//do something
break;
case "radioBtnName2":
//do something
break;
case "radioBtnName3":
//do something
break;
case "radioBtnName4":
//do something
break;
}
}
}
下面是一个使用Linq的解决方案:
var rbResult = from rb in gbState.Controls.OfType<RadioButton>()
where rb.Checked
select rb;
var rbResult=来自gbState.Controls.OfType()中的rb
rb.在哪里检查的
选择rb;
这将为您提供一个单选按钮
。
由于单选按钮应位于GroupBox之类的容器中,因此此IENumber表只能包含1或0个元素
我认为这应该有效。如果无效,请在每个RadionButton属性设置actionCommand中更正我的值(1、2、3…),然后获取按钮组的名称:
switch(Integer.parseInt(buttonGroup.getSelection().getActionCommand()))
{
case 1:
do something...
break;
case 2:
do somenthing...
break;
case 3:
do somenthing...
break;
default:
}
是WinForms、WPF还是WebForms?你在使用WebForms吗?如果是,为什么不使用RadioButtonList
?@TA先生:这有关系吗?这不是关于单选按钮的问题,而是关于带有多个布尔语句的switch
。这太复杂了,你必须为每个单选按钮定义一个新的CheckChanged处理程序。声明枚举和因此,如果单选按钮还没有eventHandler,我就不会使用switch。OP要求用switch case替换if-else if,唯一的方法是在另一个控件的eventHandler中创建该控件(您的解决方案也不起作用)。为什么这比原来的解决方案好?@Cody Readability是我能想到的唯一原因。Dang。这让我们不得不硬编码单选按钮名称。2017签入-您现在可以在案例中使用nameof(rbFrenchImpl)!
private void radioButton_Click(object sender, RoutedEventArgs e)
{
RadioButton radioBtn = (RadioButton)sender;
if (radioBtn.IsChecked == true)
{
switch (radioBtn.Name)
{
case "radioBtnName1":
//do something
break;
case "radioBtnName2":
//do something
break;
case "radioBtnName3":
//do something
break;
case "radioBtnName4":
//do something
break;
}
}
}
var rbResult = from rb in gbState.Controls.OfType<RadioButton>()
where rb.Checked
select rb;
switch(Integer.parseInt(buttonGroup.getSelection().getActionCommand()))
{
case 1:
do something...
break;
case 2:
do somenthing...
break;
case 3:
do somenthing...
break;
default:
}