2009-02-16 113 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以任何有意义的你。对我来说,关键出来的数据库,所以是有意义的是数字型。)