2010-12-16 135 views
4

我有很多的单选按钮所以我最终的代码看起来像这样单选按钮和开关

if (rbFrenchImp.Checked) 
{ 
} 
else if (rbFrenchMet.Checked) 
{ 
} 
else if (rbEnglishImp.Checked) 
{ 
} 
else if (rbFrenchEuro.Checked) 
{ 
} 
//etc... 

所以我想知道,是否有可能使用一个开关的情况下与单选按钮?如果是的话如何?

+0

它是WinForms,WPF还是WebForms? – 2010-12-16 13:32:49

+1

你使用webforms吗?如果是这样,为什么不使用'RadioButtonList'? – 2010-12-16 13:33:08

+1

@Mr。 TA:这很重要吗?这不是关于单选按钮的问题,它是关于带有多个布尔语句的'switch'。 – Bobby 2010-12-16 13:34:05

回答

6

是的,你可以:

您SUBCRIBE相同CheckChanged(或类似)事件处理到每个单选按钮。然后你把这样的代码:

RadioButton btn = sender as RadioButton; 
if(btn!= null && btn.IsChecked) 
{ 
    Switch(btn.Name) 
    { 
     case "rbFrenchImpl": 
     break; 
     ... 
    } 
} 

这适用于所有类型的框架。

+4

当。这给我们留下了硬编码的单选按钮名称。 – 2012-03-11 23:57:17

+0

2017入住 - 您现在可以在案件中使用nameof(rbFrenchImpl)! – Squirrelkiller 2017-07-18 15:00:10

1

您的意思是RadioButtonList?如果是这样,你可以寻找.SelectedValue。否则,如果您刚刚选择了单选按钮,则只能选择是,以某种方式循环播放它们。不过,我猜测你可以用RadioButtonList取代你的计划,以取得某种成功。

0
//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; 
} 
+0

它太复杂了,您必须为每个单选按钮定义一个新的CheckChanged处理程序。声明枚举等...... – 2010-12-16 13:42:13

+0

如果单选按钮没有eventHandler,我不会使用开关。 OP要求一种方法来替换if - else if如果使用switch case,并且唯一的方法就是如果在另一个控件的事件处理程序中进行了该控件(您的解决方案也不起作用)。 – Pabuc 2010-12-16 13:44:44

+0

为什么这比原来的解决方案更好? – 2010-12-16 13:48:38

4

感觉稍微哈克,但你可以建立包含一个Dictionary<RadioButton, Action>

Dictionary<RadioButton, Action> _rbMethods = new Dictionary<RadioButton, Action>(); 

当装载:RadioButton控制和相应的方法(即是无参数void方法,匹配Action委托签名)之间的映射形式,添加按钮和相应的方法,以在地图上:

_rbMethods.Add(rbFrenchImp, FrenchImpAction); 
_rbMethods.Add(rbFrenchMet, FrenchMetAction); 
_rbMethods.Add(rbEnglishImp, EnglishImpAction); 

然后,可以很容易地调用相应于所检查的单选按钮的方法(或按钮,如果它们在不同的基团):

foreach (RadioButton key in _rbMethods.Keys.Where(rb => rb.Checked)) 
{ 
    _rbMethods[key](); 
} 
2

这是我发现用多个单选按钮将“if语句”更改为case开关的最佳方法。您只需使用单选按钮即可选择属性下的事件选项卡,并在“选中”事件下选择radioButton_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; 
       } 

      } 


     } 
0

下面是使用LINQ的解决方案:

var rbResult = from rb in gbState.Controls.OfType<RadioButton>() 
where rb.Checked 
select rb; 

这会给你一个<IENumerable>RadioButton。 因为你的Radibuttons应该像一个GroupBox一样在容器中,所以这个IENumberable只能包含1或0个元素。

我认为这应该工作。如果没有,请纠正我