2010-09-28 94 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