2009-02-16 114 views
4

我想下面的枚舉綁定枚舉到LINQ和SelectListItem

public enum CertificateTypes : byte 
{ 
    None = 0, 
    Original = 1, 
    AuthenticatedCopy = 2, 
    Numbered = 3 
} 

綁定到數據庫上tinyint列。但是,在創建SelectListItems並調用時,例如,SelectListItem的Person.CertificateTypes.Original.ToString() I get this:

<option value="Original">Original</option> 

which is not bindable to a byte? column. How should I do this? Should I explicitly set the value to "1" on the Value屬性?或者有沒有辦法讓這項工作「自動」?

回答

14

如果你想自動的,你可以這裏使用

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>().Select(e => (byte)e); 
var selectList = new SelectList(enumValues); 

問題是,你只得到字節,所以你可能需要選擇一個新的類型有點像......

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>() 
                 .Select(e => new KeyValuePair<byte, string>((byte)e, e.ToString())); 
var selectList = new SelectList(enumValues, "Key", "Value"); 

這將只是採取可能的值從枚舉和t將其轉換爲IEnumerable的CertificateTypes,然後獲取每個值並將其轉換爲新的KeyValuePair。

有一件事要注意,如果你有一個[Flags]屬性,通常只是讓你的枚舉複數化是個好主意。否則,我會把它命名爲單數。

得愛LINQ!

+0

+1:正在尋找此解決方案的短褲,而不是字節的鑰匙。奇蹟般有效。 – ericb 2011-10-04 23:00:30

0

我真的懷疑在一個枚舉上調用ToString()返回xml ...你能澄清一下是怎麼發生的?您可能想要將枚舉強制轉換爲byte/int(並在大部分時間內以數字形式工作),或者在某些時候使用Enum.Parse - 但如果不理解如何將它鉤在一起,很難說。

1

不知道ASP.NET/MVC中以下轉化爲SelectListItems的方法,因爲我沒有經驗,但也許這可以使用。


當然,你必須專門投枚舉到它的基本類型一樣(byte)Person.CertificateTypes.Original得到它與數據庫對話很好。

在的WinForms,我用KeyValuePair<byte,string>IList綁定到ComboBox,使用類似以下內容:

foreach (Enum value in Enum.GetValues(typeof(CertificateTypes)) 
    MyBindingIList.Add(new KeyValuePair<byte,string>((byte)value, value.ToString())); 

我然後綁定的ComboBox並設置它的DisplayMember"Value"ValueMember"Key"。 (您可以切換在KeyValuePairKeyValue以任何有意義的你。對我來說,關鍵出來的數據庫,所以是有意義的是數字型。)