RadioButton和开关

时间:2010-12-16 13:29:55

标签: c# winforms switch-statement

我有很多单选按钮,所以我最终得到的代码看起来像这样

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

所以我想知道,是否可以使用带单选按钮的开关盒?如果是的话怎么样?

8 个答案:

答案 0 :(得分:6)

是的,你可以:

您为每个单选按钮订阅相同的CheckChanged(或类似)事件处理程序。然后你输入一些像这样的代码:

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

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

答案 1 :(得分:4)

感觉有点hacky,但您可以设置一个Dictionary<RadioButton, Action>,其中包含RadioButton控件和相应方法(无参数void方法之间的映射,与Action委托相匹配签名):

Dictionary<RadioButton, Action> _rbMethods = new Dictionary<RadioButton, 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 :(得分:2)

这是我找到的用于将带有多个单选按钮的“if语句”更改为案例开关的最佳方法。您只需使用单选按钮选择属性下的事件选项卡,然后选择“已检查”事件下的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;
                }

            }


        }

答案 3 :(得分:1)

你的意思是RadioButtonList?如果是这样,您只需查找.SelectedValue

否则,如果您刚刚选择了单选按钮,那么您只能以某种方式循环使用它们。但是,我猜你可以用RadioButtonList取代你拥有的方案,以取得某种成功。

答案 4 :(得分:0)

如果您使用的是ASP.NET,则可以使用radiobuttonlist并在此example 中进行切换,但不了解Windows窗体或wpf

答案 5 :(得分: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;
}

答案 6 :(得分:0)

以下是使用Linq的解决方案:

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

这会给你一个<IENumerable>RadioButton。 由于您的Radiobutton应该像GroupBox一样位于Container中,因此IENumberable只能包含1或0个元素。

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

答案 7 :(得分: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:
  
    }