How can I assign enum values to a listbox in .NET 1.1 on the Compact Framework?

不羁的心 提交于 2019-12-13 08:18:03

问题


From http://weblogs.asp.net/stevewellens/archive/2009/08/19/how-to-fill-a-listbox-dropdownlist-from-an-enum.aspx, I see this example for assigning enum values to a listbox:

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);
}

However, in my Windows CE project (.NET 1.1), there is no "System.Enum.GetValues()"; there is "GetUnderlyingType" and "ToObject"...

Is one of those the key to accomplishing this?

UPDATE

Trying to implement Jon Skeet's code, the "ListItem" declaration fails with "The type or namespace name 'ListItem' could not be found (are you missing a using directive or an assembly reference?)"

I am using OpenNETCF. So, VS offers to add "OpenNETCF.Windows.Forms.ListItem" to my using block. But when I do, it then complains on the constructor part of that same line (ListItem item = new ListItem(field.Name, value.ToString());) with: "The best overloaded method match for 'OpenNETCF.Windows.Forms.ListItem.ListItem(string, int)' has some invalid arguments"

The entire handler now is:

private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
    // Got this from Jon Skeet (http://stackoverflow.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);
    }
}

UPDATE 2

This works:

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);
    }
}

It's true that the enums themselves are not populating the listboxes, just the strings that represent them, but that's okay, because I have to use a kludgy way to assign the value, too:

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://stackoverflow.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 ( . . .)
}

回答1:


It's been a long time since I've used the Compact Framework, but I suspect the simplest approach is just to get the field values - and store them somewhere, of course:

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);
}



回答2:


You can create your own GetValues method. From this blog post

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");
}


来源:https://stackoverflow.com/questions/17952900/how-can-i-assign-enum-values-to-a-listbox-in-net-1-1-on-the-compact-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!