“空白”を持ちながら、列挙型の値にバインドされたComboBoxエントリ?

StackOverflow https://stackoverflow.com/questions/807030

質問

WinForms ComboBoxを列挙型の値にバインドする場合、つまり

combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));

同じ結果を得る方法を知っているのは誰か、各列挙値に一致するエントリに加えて、選択されていないことを表す空白のエントリを持つこともできますか?

列挙型に特別な値を単純に追加することはできません。これは、列挙型を処理するために柔軟でなければならないためです。

ご協力いただきありがとうございます。

編集:名前ではなく実際の列挙値をバインドすることを明確にする必要があります。実際の列挙値がバインドされている場合、ComboBoxはToString()を呼び出して表示するテキストを取得します。

役に立ちましたか?

解決 3

(文字列のコレクションにバインドしたくないことを明確にした質問の編集を参照してください。)

さらにいじくりまわした後、次の怪物が機能しているようです。 combo1.SelectedItemはオブジェクト型であり、DBNullまたは(ボックス化?)列挙値になります。このコードはお勧めですか?

combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

編集: AdamとAndrewの方法は、同じことを簡単に行うことができます。みんなありがとう!

他のヒント

投稿したコードをすべて試したかどうかはわかりませんが、データバインドされたComboBoxでアイテムを追加することはできません。これはWPFではなくwinformであるため、「DataBind」はありません。関数。

これを行うことができます:

public static string[] GetEnumValues<T>(bool includeBlank) 
{
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString()));

    if (includeBlank)
    {
        values.Insert(0, string.Empty);
    }

    return values.ToArray();
}

その後

combo.DataSource = GetEnumValues<myEnumType>(true);

次のようなものを試すことができます:

Brad_Zの優れた提案を反映するように編集

static IEnumerable<String> getValues<T>(String initialValue)
{
    yield return initialValue;

    foreach (T t in Enum.GetValues(typeof(T)))
        yield return t.ToString();
}

static IEnumerable<String> getValues<T>()
{
    return getValues<T>(String.Empty);
}

これにより、次のようにこの関数の結果にバインドできます。

combo1.DataSource = getValues<myEnumType>().ToArray();

または次のように、初期アイテムに異なる値を指定する場合:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top