2009-02-16 2 views
4

Я пытаюсь связать следующие действия Enumсвязывания Enum с LINQ и SelectListItem

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

к tinyint колонки в базе данных. Однако при создании SelectListItems и при вызове, например, 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 свойство SelectListItem? Или есть способ сделать эту работу «автоматическим»?

ответ

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]. В противном случае я бы назвал его сингулярным.

Gotta love LINQ!

+0

+1: Ищет это решение для шорт вместо байтов для ключей. Работает как шарм. – ericb

0

Я действительно сомневаюсь, что вызов ToString() на перечисление возвращает xml ... вы можете уточнить, что is происходит? Вероятно, вы хотите либо перечислить перечисление в байты/int (и работать в терминах чисел большую часть времени), либо использовать Enum.Parse в какой-то момент - но трудно сказать, не понимая, как вы его подключили. .

1

Не знаете, как следующее переводит на SelectListItems в ASP.NET/MVC, хотя у меня нет опыта, но, возможно, это может быть полезно.


Конечно, вы должны специально бросить перечисление на это базовый тип, как (byte)Person.CertificateTypes.Original, чтобы заставить его говорить с базой данных красиво.

В WinForms, Я использую IList из KeyValuePair<byte,string> связываться с ComboBox, используя что-то вроде следующего:

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

Затем я связать ComboBox и установить его DisplayMember в "Value" и ValueMember к "Key". (Вы можете переключить Key и Value в KeyValuePair к тому, что имеет смысл для вас. Для меня, ключ выходит из базы данных, так что имеет смысл быть числовой тип.)

Смежные вопросы