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()

Редактировать: Я вижу, что методы Адама и Эндрю можно легко адаптировать для достижения того же самого.Спасибо ребята!

Другие советы

Не уверен, что вы, ребята, попробовали весь код, который вы публиковали, или нет, но вы не можете добавлять элементы с помощью ComboBox с привязкой к данным.Это winforms, а не WPF, поэтому функции 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