-1

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」があります...

それらの1つがこれを達成するための鍵ですか?

アップデート

Jon Skeet のコードを実装しようとすると、"ListItem" 宣言が "型または名前空間名 'ListItem' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)" で失敗します。

私は OpenNETCF を使用しています。したがって、VS は "OpenNETCF.Windows.Forms.ListItem" を使用ブロックに追加することを提案しています。しかし、そうすると、同じ行のコンストラクター部分 (ListItem item = new ListItem(field.Name, value.ToString());) で次のように不平を言います。 .ListItem.ListItem(string, int)' に無効な引数があります"

ハンドラー全体は次のようになりました。

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

更新 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://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 ( . . .)
}
4

2 に答える 2

3

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");
}
于 2013-07-30T16:56:08.840 に答える
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);
}
于 2013-07-30T16:56:23.297 に答える