DataGridView vinculado a DataTable com coluna Combobox com base no enum

Depois de ter passado muito ontem pesquisando sobre este, eu tenho que desistir.

Eu tenho um DataGridView vinculado a um Datable. Uma das colunas é um enum e quero que isso apareça como uma coluna Combobox.

Achei esse linkCriar opções de lista suspensa de enum em um DataGridView que tem uma resposta de usar o seguinte ...

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

Eu tentei isso, mas quando o usuário cria um novo registro, escolhe uma opção na lista suspensa (as opções corretas mostram) e, em seguida, sai do campo, recebe a mensagem "O valor DataGridViewComboBoxCel não é válido". Eu encontrei algumas soluções em busca que falam sobre como capturar esse erro, então não fazer nada (escondendo assim o erro), mas eu quero resolvê-lo e não apenas escondê-lo. Se o usuário estiver OK, a mensagem será repetida mais duas vezes.

Também vi soluções que percorrem os valores no enum e criam um datatable contendo o int e a string para cada um, depois usando a tabela de dados como uma origem de dados no combo. Eu usei uma tabela de dados como a fonte de uma caixa de combinação no passado ao trabalhar com um banco de dados MSSQL de backend.

Outra variante disso é percorrer e escrever diretamente no combo como este ...

    foreach (MyEnum bar in MyEnum.GetValues(typeof(MyEnum)))
    {
        string barName = MyEnum.GetName(typeof(MyEnum), bar);
        MyComboColumn.Items.Add(barName);
    }

como na pergunta neste link.Como posso adicionar alguns valores Enum a uma caixa de combinação

MINHA PERGUNTA: Pode ser feito para trabalhar usando o Enum.GetValues ​​(typeof (MyEnum)); método? O método de tabela de dados parece longo. O loop, em seguida, usando MyComboColumn.Items.Add (barName); também é um pouco longo e resultará na versão de string do enum sendo registrada na tabela de dados e não no inteiro (e preferiria que fosse o inteiro).

Não consigo encontrar exemplos do método Enum.GetValues ​​(typeof (MyEnum)) em que a grade está vinculada a uma tabela de dados. Quando pesquiso, acabo de encontrar os outros métodos.

Eu acho que o problema é provável que esteja no tipo de dados na coluna da tabela subjacente. Eu tentei isso como um inteiro, como uma string e eu tentei não defini-lo. Eu não posso pensar o que mais para tentar nesse tipo.

Aqui está o meu código simplificado. (DVG é meu DataGridView no formulário).

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);

    }
}

questionAnswers(3)

yourAnswerToTheQuestion