2010-09-28 56 views
1

我正在使用按位枚举作为中继器控件的数据源,其中每行都有一个复选框。当用户保存数据时,对应于选中框的枚举值被保存到单个数据库字段中。遍历保存的按位枚举值

但是,当用户来编辑数据时,显然我需要预先使用现有值填充中继器。我可以通过对枚举和复选框的可能值进行相应处理,以简单明了的方式做到这一点。不过,理想情况下,我真的很喜欢我的代码保持与数据更改无关:所以如果我更改或添加Enum中的值,我的代码仍然可以工作,而无需更改控件中的代码。

看起来很明显的事情是尝试迭代枚举字段中的现有值,一旦我从数据库中取回它。换句话说,如果保存的值对应于enum中几个选项中的两个选项,那么我需要循环访问这两个选项。但是,我可以看到没有可用于执行此操作的方法或属性。任何人都可以将我指向正确的方向吗?

可能有助于理解这一点的一个示例是,我可以通过将其转换为字符串并将其分开来得到我想要的效果,但它很笨拙(comsPrefs是所讨论的枚举)

 Dim selectedPrefs As String = comsPrefs.ToString() 
     Dim splitStr() As String = selectedPrefs.Split(","c) 
     Dim i As Integer 

     For i = 0 To splitStr.Length - 1 
      'do some cool stuff 
     Next 
+0

也许代码示例可以阐明你正在尝试做什么? – 2010-09-28 15:22:19

回答

2

是这样的吗?

[Flags] 
public enum YourEnum 
{ 
    One = 1, Two = 2, Four = 4, Eight = 8 
} 

// ... 

YourEnum exampleData = YourEnum.Two | YourEnum.Four; 

var values = Enum.GetValues(typeof(YourEnum)) 
       .Cast<YourEnum>() 
       .Where(x => exampleData.HasFlag(x)); 

foreach (var v in values) 
{ 
    Console.WriteLine(v); 
} 

注意,HasFlag方法只在.NET 4中使用 - 如果你正在使用的框架的早期版本,那么你就需要使用Where(x => (exampleData & x) == x)代替。

+0

不错,谢谢。我仍然不太熟悉linq/lambda将其视为解决方案! – 2010-09-28 15:52:10

0

要获得枚举的所有值,请使用Enum.GetValues(typeof(myEnumeration))

System.Enum有其他方法可以让你获得标识符(名称)并将名称转换为/从值。

注意:除非每个不同的值具有不同的唯一位模式(即没有两个不同的子集与位或 - 具有相同的值时),否则某些转换将不明确。

+0

谢谢,但我不需要所有可能的值。我只需要保存的值。所以想象一下,我的枚举是说苹果= 1,橙子= 2,梨= 4,为特定行保存的值是3(苹果或桔子)。我需要遍历所保存的潜在值,例如苹果,桔子。那有意义吗? – 2010-09-28 15:37:35