Создайте опцию drop down list из enum в DataGridView

В настоящее время у меня есть класс, и я пытаюсь создать простой графический интерфейс для создания коллекции этого класса. Большинство атрибутов этого класса являются строками. Однако одним из атрибутов, которые я хочу, чтобы пользователь мог установить, является Enum. Поэтому я хотел бы, чтобы пользовательский интерфейс имел выпадающий список для этого перечисления, чтобы запретить пользователю вводить недопустимое значение. В настоящее время я беру исходный список объектов, добавляя их в DataTable и устанавливая DataSource моего DataGridView в таблицу. Хорошо работает, даже создает столбец флажка для одного свойства Boolean. Но я не знаю, как сделать столбец для перечисления в раскрывающемся списке. Я использую С# и .NET 2.0.

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

Ответ 1

Я не знаю, будет ли это работать с столбцом DataGridView, но он работает с ComboBoxes:

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

и

MyEnum value = (MyEnum)comboBox1.SelectedValue;

UPDATE: он также работает с столбцами DataGridView, просто не забудьте установить тип значения.

DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.Name = "My Enum Column";
col.DataSource = Enum.GetValues(typeof(MyEnum));
col.ValueType = typeof(MyEnum);
dataGridView1.Columns.Add(col);

Ответ 2

Или, если вам нужно выполнить некоторую фильтрацию значений перечислителя, вы можете Enum.GetValues(typeof(EnumeratorName)) и добавить те, которые вы хотите использовать:

dataGridViewComboBoxColumn.Items.Add(EnumeratorValue)

Помимо этого, вместо использования DataTable вы можете установить для DataSource объекта DataGridView объект BindingSource, а для DataSource объекта BindingSource задать значение BindingList<Your Class>, который вы заполняете, передавая IList в конструктор.

На самом деле, мне было бы интересно узнать от кого-либо, предпочтительнее ли это использовать DataTable в ситуациях, когда у вас его еще нет (то есть он возвращается из вызова базы данных).

Ответ 3

    if(e.KeyCode == Keys.Oem3)
    {

    }

Это сработало для меня