Как вставить перечисление в .Net WinForm ComboBox - PullRequest
0 голосов
/ 21 ноября 2010

Предположим, у меня есть несколько перечислений, представляющих ... например, поставщиков баз данных: Unknown, Oracle, Sybase, SQL Server 2005, SQL Server 2008 и т. Д. Я хочу позволить пользователю выбирать между всеми этими но Unknown из поля со списком. Когда пользователь выбирает перечисление, он должен увидеть удобочитаемое описание (которое, мы надеемся, будет исходить из атрибута). Однако фактический выбранный объект должен быть перечислением этого определенного типа.

Это можно взломать вместе вручную с помощью дополнительного словаря, но я не хочу этого делать, а используйте идиоматический и самый чистый способ.

Не могли бы вы поделиться примером кода или хотя бы хорошей ссылкой?

* * 1012 P.S. Есть ли простой способ получить коллекцию всех перечислений типа vendor, кроме Unknown (который будет иметь значение short / int 0, как предписано Биллом Вагнером)?

1 Ответ

4 голосов
/ 21 ноября 2010

P.S. Есть ли простой способ получить коллекцию всех перечислений типа vendor, кроме Unknown (который будет иметь значение short / int 0, как предписано Биллом Вагнером)?

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

Чтобы связать понятное имя со значениями, вы можете использовать DescriptionAttribute, как показано в в этом ответе . Обработайте событие Format для ComboBox, чтобы отобразить описание:

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

Примечание: если ваше приложение должно быть локализуемым, атрибут Description, вероятно, не лучший вариант. Вместо этого вы можете использовать строковые ресурсы с именами, такими как DisplayName_DbVendor_Oracle, DisplayName_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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...