Подтвердить что ты не робот

Добавление перечисления в 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));

пожалуйста, советую.

4b9b3361

Ответ 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 в коде. Этот список является альтернативой словарю, используемому в вашем примере.

Но я не говорю, что это лучшее решение:-) Однако это означает, что вы можете удалить код, например, перечислить итерацию, в этот класс или специализировать класс для обработки определенных типов данных лучше, все с конечной целью вставления в список и привязан к элементу управления.