我们经常需要设置这样一些标志位:比如对于模块我们分浏览、审核、修改、删除、冻结等不同的
权限,可能还有无权限和完全权限,这些权限可叠加,可能还要分级别。对于每个模块我们都要设
置一个用户对此模块的相关权限,所以就不可避免地要对这些标志位进行绑定、显示、修改等。下
面这个类就以颜色为例子提供了相应的操作,大家有好的想法可以一起来探讨。 ----------------------- public class ColorType { //枚举所有标志,最小项应该为0, //最大项为前面数值的总和,这样最大项就包括前面所有的组合 [Flags] public enum enumColorType { Transparent=0, Yellow = 1, Red = 2, Blue = 4, AllColor=7 } public const string TRANSPARENT = "透明"; public const string YELLOW = "黄色"; public const string RED = "红色"; public const string BLUE = "蓝色"; public const string ALLCOLOR = "全色";
private static System.Collections.Specialized.ListDictionary _lstDicItem; //显示数据和单选情况下所用的数据源 public static IDictionary dicSingleOrViewColor { get { if (_lstDicItem == null) { //由于枚举的项目较少,所以使用了ListDictionary; //如果项目较多且需要排序,可以使用SortedList _lstDicItem = new System.Collections.Specialized.ListDictionary();
foreach (Int32 nConstValue in System.Enum.GetValues(typeof(enumColorType))) { //使用String类型做为KEY可减少拆装箱 _lstDicItem.Add(nConstValue.ToString(), typeof(ColorType).GetField(Enum.ToObject(typeof(enumColorType),nConstValue).ToString().ToUpper()).GetValue(null)); } } return _lstDicItem; } } //复选情况下所用的数据源,您也可以声明另一个静态变量来存储它 public static IDictionary dicMultipleColor { get { //不包含第一和最后一项。比如CheckBoxList,用户不选就是第一项,全选就是最后一项 System.Collections.Specialized.ListDictionary _lstDicItemCopied = new System.Collections.Specialized.ListDictionary(); foreach (DictionaryEntry DicEntry in _lstDicItem) { if (DicEntry.Key.ToString() == enumColorType.AllColor.ToString() || DicEntry.Key.ToString() == enumColorType.Transparent.ToString()) continue; _lstDicItemCopied.Add(DicEntry.Key,DicEntry.Value); } return _lstDicItemCopied; } } //把Key或者Value解析成相应的值 public static Int32 ParseValue(string strKeyOrValue) { int nSumTotal = 0; if(Char.IsDigit(strKeyOrValue[0])) { if (strKeyOrValue.IndexOf(',') == -1) return Int32.Parse(strKeyOrValue); foreach (string strOneValue in strKeyOrValue.Split(',')) { nSumTotal += Int32.Parse(strOneValue); } } else { nSumTotal = Convert.ToInt32((enumColorType)(System.Enum.Parse(typeof(enumColorType), strKeyOrValue,true))); } return nSumTotal; } //把Key或者Value解析成相应的汉字说明 public static string ParseValueWord(string strKeyOrValue,bool boolParsed) { if (strKeyOrValue.IndexOf(",") > -1) { if (!boolParsed) { int nParsedValue = ParseValue(strKeyOrValue); if (dicSingleOrViewColor.Contains(nParsedValue.ToString())) { return dicSingleOrViewColor[nParsedValue.ToString()].ToString(); } } string strComboWords = ""; string[] strSepWords = strKeyOrValue.Split(','); foreach (string strOneWord in strSepWords) { if (strComboWords.Length > 0) { strComboWords += "&"; } if (Char.IsDigit(strOneWord[0])) { strComboWords += dicSingleOrViewColor[strOneWord].ToString(); } else { object obj = System.Enum.Parse(typeof(enumColorType), strOneWord,true); strComboWords += dicSingleOrViewColor[((Int32)((enumColorType)obj)).ToString()].ToString(); } } return strComboWords; } else { enumColorType enumParsedColor =(enumColorType)(System.Enum.Parse(typeof(enumColorType), strKeyOrValue,true)); if (enumParsedColor.ToString().IndexOf(",") > -1) { return ParseValueWord(enumParsedColor.ToString(),true); } else { return dicSingleOrViewColor[((Int32)enumParsedColor).ToString()].ToString(); } } } public static string ParseValueWord(string strKeyOrValue) { return ParseValueWord(strKeyOrValue,false); } //判断总值中是否包括某一个值,也可循环调用此函数对一组CheckBox打勾 public static bool isContained(Int32 nTotalValue,Int32 nOneColor) { if(nTotalValue == nOneColor) return true; if(nTotalValue < nOneColor) return false; //什么值都包括0,所以要特殊处理 if(nOneColor == 0) return false; return ((nTotalValue & nOneColor) == nOneColor); } public static bool isContained(Int32 nTotalValue,enumColorType oneColor) { return (isContained(nTotalValue,(Int32)oneColor)); } //找到值最大的枚举项 public static enumColorType GetMaxItem(Int32 nTotalValue) { Int32 nMax = 0; //未使用SortedList,所以无法按从大到小的顺序找 foreach (Int32 nConstValue in System.Enum.GetValues(typeof(enumColorType))) { if (isContained(nTotalValue,nConstValue) && nConstValue > nMax ) nMax = nConstValue; } return (enumColorType)nMax; } } 
|