多个复选框和枚举

时间:2015-02-08 22:59:15

标签: c# checkbox enumeration

我遇到了麻烦,让我的头脑如何完成。 我在表单上有3个复选框要输入到构造函数中。我正在创建一个变量来将此信息传递给构造函数。下面列出了一些代码

public enum Accessories
    {
        None,
        StereoSystem,
        LeatherInterior,
        StereoAndLeather,
        ComputerNavigation,
        StereoAndNavigation,
        LeatherAndNavigation,
        All
    }

        SalesQuote.Accessories accessoryChosen;

        if(!chkStereoSystem.Checked && !chkLeatherInterior.Checked && !chkComputerNavigation.Checked)
            {
                accessoryChosen = SalesQuote.Accessories.None;
            }
            else if(chkStereoSystem.Checked && !chkLeatherInterior.Checked && !chkComputerNavigation.Checked)
            {
                accessoryChosen = SalesQuote.Accessories.StereoSystem;
            }

我确定有更清洁的方法可以做到这一点。

3 个答案:

答案 0 :(得分:3)

您应该明确设置标志值:

public enum Accessories
{
    None = 0,
    StereoSystem = 1,
    LeatherInterior = 2,
    StereoAndLeather = 3,
    ComputerNavigation = 4,
    StereoAndNavigation = 5,
    LeatherAndNavigation = 6,
    All = 7
}

现在您可以像这样计算所选的配件:

Accessories accessoryChosen = (Accessories) 
 ((chkStereoSystem.Checked ? 1 : 0)  +
  (chkLeatherInterior.Checked ? 2 : 0) +          
  (chkComputerNavigation.Checked ? 4 : 0) ) ;

这里的标志值在没有写出的情况下是相同的,但为了清楚起见,这应该是这样做的。

更新:Nadia指出Enum无需枚举所有组合。

如果有更多的配件出现,这将变得非常尴尬。

让我们再添加两个

WarpDrive = 8,
FluxCompensator = 16,

这将带来最多32个组合的数量!哎哟!

而是将组合全部删除,或仅包含一些非常重要的组合link in Nadia's comment建议。

现在,您需要查询以获取附件。使用按位算法可以编写辅助函数:

bool Has(Accessories Chosen, Accessories Target)
{
    return (Chosen & Target) != Accessories.None;
}

或者,假设他们坐在班级OrderCar中,您可以添加班级功能:

bool Has(Accessories Target)
{
    return (this.ChosenAccessories & Target) != Accessories.None;
}

如果您希望组合在显示为字符串时显示其值的精美列表,也可以添加[FlagsAttribute]

答案 1 :(得分:2)

你可以制作你的枚举标志,然后你不必在枚举中拥有所有组合,而是使用|然后在变量中组合:

[Flags]public enum Accessories
{
    None=0,
    StereoSystem = 1,
    LeatherInterior =2,
    //StereoAndLeather = StereoSystem | LeatherInterior ,
    ComputerNavigation = 4,
    //StereoAndNavigation = StereoSystem | ComputerNavigation ,
    //LeatherAndNavigation = LeatherInterior | ComputerNavigation,
    All =  StereoSystem | LeatherInterior | ComputerNavigation
}

accessoryChosen =  Accessories.None;
if(chkStereoSystem.Checked )
       accessoryChosen |= Accessories.StereoSystem ;//You can add all flags this way, accessoryChosen will contain them all


if( (accessoryChosen & Accessories.StereoSystem) == Accessories.StereoSystem) 
    ...//StereoSystem was chosen

因此,如果您必须添加一些新类型的配件,您将自动拥有所有其他组合。

答案 2 :(得分:1)

您可以使用RadioButton的标签属性(假设Papa的评论是正确的)

在表单的构造函数中:

    chkStereoSystem.Tag = Accesories.StereoSystem;
    chkLeatherInterior.Tag = Accesories.LeatherInterior;
    chkComputerNavigation.Tag = Accesories.ComputerNavigation;

无论何时你需要选择的那个:

 SalesQuote.Accessories accessoryChosen =(Accessories) yourForm.Controls.OfType<RadioButton>()
                                  .FirstOrDefault(r => r.Checked).Tag;

如果没有选择RadioButton,FirstOrDefault将返回0,它将为您提供枚举的第一个元素:None