我遇到了麻烦,让我的头脑如何完成。 我在表单上有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;
}
我确定有更清洁的方法可以做到这一点。
答案 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;
}
或者,假设他们坐在班级Order
或Car
中,您可以添加班级功能:
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