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