Как я могу присвоить значения перечисления списку в.NET 1.1 на Compact Framework?
Из http://weblogs.asp.net/stevewellens/archive/2009/08/19/how-to-fill-a-listbox-dropdownlist-from-an-enum.aspx я вижу этот пример для назначения значений перечисления список:
Array Values = System.Enum.GetValues(EnumType);
foreach (int Value in Values)
{
string Display = Enum.GetName(EnumType, Value);
ListItem Item = new ListItem(Display, Value.ToString());
TheListBox.Items.Add(Item);
}
Однако в моем проекте Windows CE (.NET 1.1) нет "System.Enum.GetValues ()"; есть "GetUnderlyingType" и "ToObject"...
Является ли один из них ключом к достижению этого?
ОБНОВИТЬ
При попытке реализовать код Джона Скита, объявление "ListItem" завершается неудачно: "Не удалось найти тип или имя пространства имен" ListItem "(отсутствует директива using или ссылка на сборку?)"
Я использую OpenNETCF. Итак, VS предлагает добавить "OpenNETCF.Windows.Forms.ListItem" в мой блок использования. Но когда я это делаю, он потом жалуется на часть конструктора той же строки (ListItem item = new ListItem(field.Name, value.ToString());) с: "Лучший перегруженный метод соответствует для OpenNETCF.Windows.Forms.ListItem.ListItem(string, int)'имеет недопустимые аргументы "
Весь обработчик теперь:
private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
// Got this from Jon Skeet (http://stackru.com/questions/17952900/how-can-i-assign-enum-values-to-a-listbox-in-net-1-1)
Type type = typeof(PrintUtils.BeltPrinterType);
foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public))
{
// Fortunately unboxing to the enum's underlying field type works
int value = (int) field.GetValue(null);
ListItem item = new ListItem(field.Name, value.ToString());
listBoxBeltPrinters.Items.Add(item);
}
}
ОБНОВЛЕНИЕ 2
Это работает:
private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
Type type = typeof(PrintUtils.BeltPrinterType);
foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public))
{
string display = field.GetValue(null).ToString();
listBoxBeltPrinters.Items.Add(display);
}
}
Это правда, что сами перечисления не заполняют списки, а только строки, которые их представляют, но это нормально, потому что я тоже должен использовать хитрый способ присвоения значения:
private void listBoxBeltPrinters_SelectedIndexChanged(object sender, System.EventArgs e)
{
//Tried to do something more "el[egant,oquent]" but .NET 1.1 seems to be holding me back
// http://stackru.com/questions/17953173/how-can-i-assign-the-value-selected-in-a-listbox-to-an-enum-var/17953297?noredirect=1#17953297
string sel = listBoxBeltPrinters.SelectedItem.ToString();
if (sel == "Zebra QL220")
{
PrintUtils.printerChoice = PrintUtils.BeltPrinterType.ZebraQL220;
}
else if (sel == "ONiel")
{
PrintUtils.printerChoice = PrintUtils.BeltPrinterType.ONiel;
}
//else if ( . . .)
}
2 ответа
Прошло много времени с тех пор, как я использовал Compact Framework, но я подозреваю, что самый простой подход - просто получить значения полей - и, конечно, где-то их хранить:
Type type = typeof(EnumType);
foreach (FieldInfo field in type.GetFields(BindingFlags.Static |
BindingFlags.Public))
{
// Fortunately unboxing to the enum's underlying field type works
int value = (int) field.GetValue(null);
ListItem item = new ListItem(field.Name, value.ToString());
TheListBox.Items.Add(item);
}
Вы можете создать свой собственный GetValues
метод. Из этого блога
private static int[] GetValues(Type enumType)
{
if (enumType.BaseType == typeof (Enum))
{
//get the public static fields (members of the enum)
var fi = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
//create a new enum array
var values = new int[fi.Length];
//populate with the values
for (var iEnum = 0; iEnum < fi.Length; iEnum++)
{
values[iEnum] = (int) fi[iEnum].GetValue(null);
}
//return the array
return values;
}
//the type supplied does not derive from enum
throw new ArgumentException("enumType parameter is not a System.Enum");
}