Перечисления и поля со списком в C # - PullRequest
7 голосов
/ 26 февраля 2011

Я сейчас занимаюсь разработкой приложения на C #.

Мне нужно использовать перечисление с полем со списком, чтобы получить выбранный месяц.У меня есть следующее для создания перечисления:

enum Months 
{ 
   January = 1,
   February,
   March,
   April,
   May,
   June,
   July,
   August,
   September,
   October,
   November,
   December 
};

Затем я инициализирую комбинированный список, используя следующее:

cboMonthFrom.Items.AddRange(Enum.GetNames(typeof(Months)));

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

Чтобы получить значение перечислитель из поля со списком, я использовал следующее:

private void cboMonthFrom_SelectedIndexChanged(object sender, EventArgs) 
{
   Months selectedMonth = (Months)cboMonthFrom.SelectedItem;
   Console.WriteLine("Selected Month: " + (int)selectedMonth);
}

Однако, когда я пытаюсь запустить приведенный выше кодпоявляется сообщение об ошибке «Первое случайное исключение типа System.InvalidCastException».

Что я сделал неправильно.

Спасибо за любую помощь, которую вы можете оказать

Ответы [ 5 ]

7 голосов
/ 26 февраля 2011

Попробуйте это

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem.ToString());

вместо

Months selectedMonth = (Months)cboMonthFrom.SelectedItem;

Обновлено с правильными изменениями

6 голосов
/ 26 февраля 2011

Проблема в том, что вы заполняете комбинированный список именами строк (Enum.GetNames возвращает string[]), а позже вы пытаетесь привести его к своему перечислению.Одним из возможных решений может быть:

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem);

Я бы также рассмотрел использование существующей месячной информации из .Net вместо добавления вашего enum:

var formatInfo = new System.Globalization.DateTimeFormatInfo();

var months = Enumerable.Range(1, 12).Select(n => formatInfo.MonthNames[n]);
5 голосов
/ 26 февраля 2011

Попробуйте

Months selectedMonth = 
    (Months) Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem);
3 голосов
/ 27 февраля 2011

На самом деле нет никакой причины использовать Enum.GetNames вообще. Зачем хранить строки в ComboBox, если вы действительно хотите месяцы?

Просто используйте Enum.GetValues вместо:

foreach (var month in Enum.GetValues(typeof(Months)))
    cboMonthFrom.Items.Add(month);

[...]

// This works now
Months selectedMonth = (Months)cboMonthFrom.SelectedItem;
1 голос
/ 26 февраля 2011

Вы сохранили названия месяцев в выпадающем списке, а не значения int. Ваш выбранный элемент будет строкой.

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