Создайте параметры раскрывающегося списка из перечисления в DataGridView.

StackOverflow https://stackoverflow.com/questions/56443

Вопрос

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

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

Это было полезно?

Решение

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

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

и:

MyEnum value = (MyEnum)comboBox1.SelectedValue;

ОБНОВЛЯТЬ:Он также работает со столбцами DataGridView, просто не забудьте установить тип значения.

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

Другие советы

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

dataGridViewComboBoxColumn.Items.Add(EnumeratorValue)

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

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

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

    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top