Проведя много вчерашнего поиска по этому вопросу, я должен отказаться.DataGridView, связанный с DataTable с столбцом Combobox на основе enum
У меня есть DataGridView, связанный с Datatable. Один из столбцов - это перечисление, и я хочу, чтобы это отображалось как столбец Combobox.
Я нашел эту ссылку Create drop down list options from enum in a DataGridView, которая имеет ответ, используя следующие ...
DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.Name = "My Enum Column";
col.DataSource = Enum.GetValues(typeof(MyEnum));
col.ValueType = typeof(MyEnum);
dataGridView1.Columns.Add(col);
Я пробовал это, но когда пользователь создает новую запись, выбирает опцию из выпадающего вниз (корректные параметры показывают), затем удаляется поле, в котором они получают сообщение «Значение DataGridViewComboBoxCel недействительно». Я нашел несколько решений в поиске разговоров о том, как заманить эту ошибку, а затем ничего не делать (таким образом, скрывая ошибку), но я хочу решить ее, а не просто скрыть ее. Если пользователь в порядке, то сообщение, которое они получили, повторяется еще два раза.
Я также видел решения, которые проходят через значения в перечислении и создают datatable, содержащие int и строку для каждого, а затем используют datatable в качестве источника данных в комбо. Я использовал datatable как источник для combobox в прошлом при работе с базой данных MSSQL.
Другой вариант это перебрать и писать прямо в комбо, такие как это ...
foreach (MyEnum bar in MyEnum.GetValues(typeof(MyEnum)))
{
string barName = MyEnum.GetName(typeof(MyEnum), bar);
MyComboColumn.Items.Add(barName);
}
, например, в вопросе в этой ссылке. How can I add some Enum values to a combobox
МОЙ ВОПРОС: Можно ли его заставить работать с помощью Enum.GetValues (typeof (MyEnum)); метод? Метод данных кажется длинным. Затем цикл, используя MyComboColumn.Items.Add (barName); также немного длиннее, и приведет к тому, что строковая версия перечисления будет записана в datatable, а не целое число (и я предпочел бы это целое число).
Я не могу найти примеры метода Enum.GetValues (typeof (MyEnum)), где сетка привязана к datatable. Когда я нахожусь на этом, я просто сталкиваюсь с другими методами.
Я думаю, что проблема, скорее всего, будет заключаться в типе данных в базовом столбце таблицы. Я пробовал это как целое число, как строку, и я пытался не определять его. Я не могу думать, что еще попробовать по этому типу.
Вот мой упрощенный код. (DVG - это мой DataGridView в форме).
enum EngineType
{
None = 0,
EngineType1 = 1,
EngineType2 = 2
}
public partial class MyClass : Form
{
DataTable DtTbl;
public MyClass()
{
InitializeComponent();
CreateTableStructure();
}
private void CreateTableStructure()
{
DGV.AutoGenerateColumns = false;
DGV.DataSource = DtTbl;
DtTbl = new DataTable();
DtTbl.Columns.Add(new DataColumn("Name", System.Type.GetType("System.String")));
DataGridViewTextBoxColumn NameCol = new DataGridViewTextBoxColumn();
NameCol.DataPropertyName = "Name";
NameCol.HeaderText = "Name";
DGV.Columns.Add(NameCol);
DtTbl.Columns.Add(new DataColumn("Engine", System.Type.GetType("System.Int32")));
DataGridViewComboBoxColumn EngineCol = new DataGridViewComboBoxColumn();
EngineCol.DataPropertyName = "Engine";
EngineCol.HeaderText = "Engine";
//EngineCol.DataSource = EngineType.GetValues(typeof(EngineType));
foreach (EngineType engine in EngineType.GetValues(typeof(EngineType)))
{
string engineName = EngineType.GetName(typeof(EngineType), engine);
EngineCol.Items.Add(engineName);
}
DGV.Columns.Add(EngineCol);
}
}
Забыла сказать, что я получаю ту же ошибку в первом решении, если я пытаюсь добавить записи в DataTable программно, а также когда пользователь пытается и использует combobox, чтобы выбрать допустимую запись. – RosieC