2010-11-20 65 views
0

假設我有例如數據庫廠商幾個枚舉代表...:UnknownOracleSybaseSQL Server 2005SQL Server 2008,等我想讓所有用戶之間進行選擇這些但來自組合框的Unknown。當用戶選擇一個枚舉時,他們應該看到一個人類可讀的描述(希望來自一個屬性)。但是,所選的實際對象應該是該特定類型的枚舉。如何堅持枚舉到.NET WinForm的組合框

這可以在額外的字典的幫助下手動入侵,但我不想這樣做,而是使用慣用和最乾淨的方式。

你願意分享一個代碼示例,或至少是一個很好的鏈接?

P.S.除了Unknown(根據Bill Wagner的規定,其短/ int值爲0),有沒有簡單的方法來獲取類型供應商的所有枚舉的集合?

+0

可能重複[?我怎麼有自定義字符串格式化枚舉值枚舉綁定組合框中(http://stackoverflow.com/questions/796607/how -DO-I-有-AN-枚舉結合,組合框,與定製字符串格式化換-E num-valu) – nawfal 2013-06-08 23:44:31

回答

4

P.S.是否有一種簡單的方法來獲取類型供應商的所有枚舉的集合,除了Unknown(根據Bill Wagner的規定,它的short/int值爲0)?

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .ToArray(); 

要在友好名稱值相關聯,您可以使用DescriptionAttribute,如圖this answer。處理Format事件ComboBox的顯示說明:

private void comboBoxVendor_Format(object sender, ListControlConvertEventArgs e) 
{ 
    DbVendor vendor = (DbVendor)e.ListItem; 
    e.Value = vendor.GetDescription(); 
} 

注意:如果您的應用程序需要本地化的Description屬性可能不是最好的選擇。相反,你可以使用字符串資源與名稱,如DisplayName_DbVendor_OracleDisplayName_DbVendor_SqlServer,等等,那麼你可以爲一個值檢索顯示名稱如下:

DbVendor vendor = ...; 
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor); 

編輯:如果你需要通過描述值進行排序,只是改變了LINQ查詢,如下所示:

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .OrderBy(v => v.GetDescription()) 
         .ToArray(); 
+0

+1好的答案,謝謝! – 2010-11-20 22:39:12

+0

一些後續步驟:A)在運行時我可以將它提供給WinForm組合框之前,是否需要將枚舉的IEnumerable轉化爲數組? B)關於這些項目的排序 - 枚舉列表是否保持它們被聲明的順序?如果我想按描述進行明確排序,那麼我將如何修改該LINQ查詢? – 2010-11-20 22:52:34

+1

A)我不知道如果你只是直接將IEnumerable分配給DataSource,它將如何工作......我通常使用ToArray或ToList來確保查詢只執行一次。 B)看我的編輯 – 2010-11-20 23:00:28