好吧,我有一个Form,它接收Employee的级别,并使用一堆Checkboxes
根据他的级别启用一些选项。然而,我面临的问题是,对于我的应用程序的逻辑,每个选项都有特定的级别范围,因此我创建了一个丑陋的IF
范围检查语句,我相信有更好的方法可以实现。
CODE :
if (level >= 1 && level < 3) {
_items[0].Enabled = true;
_items[1].Enabled = false;
_items[2].Enabled = false;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 3 && level < 5) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = false;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 5 && level < 7) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 7 && level < 9) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = true;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 9 && level < 11) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = true;
_items[4].Enabled = true;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 11 && level < 13) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = true;
_items[4].Enabled = true;
_items[5].Enabled = true;
_items[6].Enabled = false;
_items[7].Enabled = false;
}
else if (level >= 13 && level < 15) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = true;
_items[4].Enabled = true;
_items[5].Enabled = true;
_items[6].Enabled = true;
_items[7].Enabled = false;
}
else if (level >= 15 && level < 17) {
_items[0].Enabled = true;
_items[1].Enabled = true;
_items[2].Enabled = true;
_items[3].Enabled = true;
_items[4].Enabled = true;
_items[5].Enabled = true;
_items[6].Enabled = true;
_items[7].Enabled = true;
}
答案 0 :(得分:18)
您可以通过一些数学来简化:
int on = (level+1)/2;
for (int i = 0 ; i != 8 ; i++) {
_items[i].Enabled = (i < on);
}
第一行将1到16(包括1和16)范围内的数字转换为1到8(包括1和8)范围内的数字。然后循环遍历所有项目,并启用尽可能多的项目,如之前计算的on
变量的值所示。
答案 1 :(得分:6)
你(可能)会失去性能,但它可以说更具可读性。选择你的毒药!性能差异取决于调用此频率的频率。
if(level >= 1) {
_items[0].Enabled = level >= 1;
_items[1].Enabled = level >= 3;
_items[2].Enabled = level >= 5;
_items[3].Enabled = level >= 8;
_items[4].Enabled = level >= 9;
_items[5].Enabled = level >= 11;
_items[6].Enabled = level >= 13;
_items[7].Enabled = level >= 15;
}
答案 2 :(得分:4)
一个选项,您可以使用Dictionary
存储每个复选框索引的范围:
private static Dictionary<int, Tuple<int, int>> _Ranges = new Dictionary<int, Tuple<int, int>>()
{
{ 0, Tuple.Create(1, 3) },{ 1, Tuple.Create(3, 5) },{ 2, Tuple.Create(5, 7) },{ 3, Tuple.Create(7, 9) },
{ 4, Tuple.Create(9, 11) },{ 5, Tuple.Create(11, 13) },{ 6, Tuple.Create(13, 15) },{ 7, Tuple.Create(15, 17) }
};
现在这个简洁的代码应该这样做:
for(int i = 0; i <= 7; i++)
{
var range = _Ranges[i];
_items[i].Enabled = level >= range.Item1 && level < range.Item2;
}
您还可以创建一个自定义Range
类来封装此逻辑。
答案 3 :(得分:1)
将其转为类似的东西:
_items[0].Enabled = ( level >= 1 && level < 17 );
....
答案 4 :(得分:0)
摆脱其他人:
_items[0].Enabled = false;
_items[1].Enabled = false;
_items[2].Enabled = false;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
if (level >= 1)
_items[0].Enabled = true;
if (level >= 3)
_items[1].Enabled = true;
if (level >= 5)
_items[2].Enabled = true;
if (level >= 7)
_items[3].Enabled = true;
if (level >= 9)
_items[4].Enabled = true;
if (level >= 11)
_items[5].Enabled = true;
if (level >= 13)
_items[6].Enabled = true;
if (level >= 15 && level < 17)
_items[7].Enabled = true;
答案 5 :(得分:0)
您的安全级别似乎完全重叠
所以你不能做一些像
这样简单的事情 _items[0].Enabled = (level >= 1);
_items[1].Enabled = (level >= 3);
_items[2].Enabled = (level >= 5);
等?
答案 6 :(得分:0)
我倾向于建议这种启用/禁用表单组件的方法是有缺陷的。最顶层的答案只能解决这个狭隘的案例,其中表格中的项目是有序的,并且与特权级别对应1到N ......
如果此应用程序使用任何类型的表示分离方案(MVC,MVVM等),那么通过数据绑定当然可以做到这一点。
但是即使在最天真的情况下,处理这种情况的更好方法是在复选框中添加一个权限级别标志(可能在WinForms中使用它们的标签,WPF中的附加属性等)并循环比较它们反对用户的当前特权。特权级别的复选框字典也可以很好地工作:
Dictionary<Control, int> RequiredControlPrivilege;
foreach(var item in _items)
{
if(RequiredControlPrivilege.Contains(item)
{
item.Enabled = RequiredControlPrivilege[item] >= CurrentLevel
}
else
{
item.Enabled = false //Default to false or change to true...
}
}