Добавление перечисления в combobox
Привет, я могу узнать, как получить значение перечисления ниже для привязки в поле со списком?
Я написал код ниже, который хорошо работает, но удивляйтесь, что это лучший способ.
public enum CourseStudentStatus
{
Active = 1,
Completed = 2,
TempStopped = 3,
Stopped = 4,
}
//Bind Course Status
Dictionary<string, int> list = new Dictionary<string, int>();
foreach (int enumValue in Enum.GetValues(typeof(CourseStudentStatus)))
list.Add(Enum.GetName(typeof(CourseStudentStatus), enumValue), enumValue);
var column = ((DataGridViewComboBoxColumn)dgv.Columns["studentCourseStatus"]);
column.DataPropertyName = "StudentStatus";
column.DisplayMember = "Key";
column.ValueMember = "Value";
column.DataSource= list.ToList();
----------------- UPDATE -------------------
Привет, я изменил свой код на это согласно Sanjeevakumar Hiremat, и он отлично работает.
cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));
Однако, когда я хочу Get() и хочу привязать значение обратно к cbStatus, он выдал ошибку { "Ссылка на объект не установлена в экземпляр объекта".}
cbStatus.SelectedValue = Course.Status;
.
Источник cbStatus.Datasource не пуст и имеет значение после привязки к cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));
пожалуйста, советую.
Ответы
Ответ 1
Следующим должен быть самый простой способ связать его.
column.DataSource = Enum.GetValues(typeof(CourseStudentStatus));
Чтобы получить выбранное значение, вам нужно передать его в тип перечисления.
CourseStudentStatus selectedValue = (CourseStudentStatus)column.SelectedValue
Enum.GetValues возвращает массив значений enumType, которые затем могут быть привязаны к любому элементу управления.
Я протестировал это на автономной combobox, а не в столбце combobox в DataGridView, YMMV.
Ответ 2
Я не думаю, что есть лучший способ. Раньше я делал что-то подобное с классом GenericListItem<T>
, где T - значение поддержки, в вашем случае перечисление.
В этом классе выставлены строки Display
и Value
T свойства для привязки. Я думаю, что я также переопределял ToString
, потому что это значение по умолчанию, если вы не указали DisplayMember
. Я пошел дальше и сделал конструктор, взяв только Value
и по умолчанию Display
до Value.ToString
, который, как мне кажется, в случае перечислений.
Затем я создам List<GenericListItem<T>>
, передаю его в DataSource
столбца и соответствующим образом устанавливаю свойства DisplayMember
и ValueMember
в коде. Этот список является альтернативой словарю, используемому в вашем примере.
Но я не говорю, что это лучшее решение:-) Однако это означает, что вы можете удалить код, например, перечислить итерацию, в этот класс или специализировать класс для обработки определенных типов данных лучше, все с конечной целью вставления в список и привязан к элементу управления.