ComboBox связан со значениями типа enum, но также имеет пустую запись? - PullRequest
4 голосов
/ 30 апреля 2009

Если я связываю WinForms ComboBox со значениями типа enum, т.е.

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

Кто знает, как я мог бы достичь того же результата, хотя помимо записей, соответствующих каждому значению перечисления, у меня также может быть пустая запись, не представляющая выбор?

Я не могу просто добавить специальное значение к типу перечисления, потому что оно должно быть гибким, чтобы иметь дело с любым типом перечисления.

Буду признателен за вашу помощь.

Редактировать: Я должен дать понять, что я хочу связать фактические значения перечисления, а не их имена. Если фактические значения перечисления связаны, ComboBox позаботится о вызове их ToString (), чтобы получить текст для отображения.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2009

Не уверен, что вы, ребята, перепробовали весь код, который вы публиковали, или нет, но вы не можете добавлять элементы в 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);
3 голосов
/ 30 апреля 2009

Вы можете попробовать что-то вроде этого:

( Отредактировано, чтобы отразить превосходное предложение 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();
1 голос
/ 30 апреля 2009

(см. Мое изменение к вопросу, в котором я пояснил, что не хочу связываться с набором строк).

После еще большей неурядицы, кажется, работает следующее чудовище. combo1.SelectedItem имеет тип объекта и будет либо значением перечисления DBNull, либо (в штучной упаковке?). Этот код рекомендуется?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...