DataGridView vinculado a la columna DataTable with Combobox basada en enum

Después de haber pasado un montón de ayer buscando en este tengo que renunciar.

Tengo un DataGridView vinculado a un Datatable. Una de las columnas es una enumeración y quiero que se muestre como una columna Combobox.

Encontré este enlaceCrear opciones de lista desplegable desde enum en un DataGridView que tiene una respuesta de usar lo siguiente ...

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

Lo he intentado pero, cuando el usuario crea un nuevo registro, elige una opción del menú desplegable (se muestran las opciones correctas), luego se aleja del campo y aparece el mensaje "El valor de DataGridViewComboBoxCel no es válido". He encontrado algunas soluciones en la búsqueda que hablan de cómo atrapar este error, luego no hacer nada (ocultando así el error), pero quiero resolverlo, no solo ocultarlo. Si el usuario acepta el mensaje, lo repetirá dos veces más.

También he visto soluciones que recorren los valores en la enumeración y crean una tabla de datos que contiene el int y la cadena para cada uno, y luego usan la tabla de datos como fuente de datos en el combo. He usado una fuente de datos como la fuente de un cuadro combinado en el pasado cuando trabajaba con una base de datos MSSQL de back-end.

Otra variante de esto es recorrer y escribir directamente en el combo como este ...

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

Como en la pregunta en este enlace.¿Cómo puedo agregar algunos valores Enum a un cuadro combinado?

MI PREGUNTA: ¿Se puede hacer funcionar utilizando Enum.GetValues ​​(typeof (MyEnum)); ¿método? El método datable parece largo aliento. El bucle luego utiliza MyComboColumn.Items.Add (barName); también es algo largo y sinuoso y dará lugar a que la versión de la cadena de la enumeración se registre en el datatable no en el entero (y preferiría que fuera el entero).

No puedo encontrar ejemplos del método Enum.GetValues ​​(typeof (MyEnum)) donde la cuadrícula está vinculada a un datatable. Cuando busco eso, simplemente me encuentro con los otros métodos.

Creo que es probable que el problema se encuentre en el tipo de datos en la columna de la tabla subyacente. He intentado esto como un entero, como una cadena y he intentado no definirlo. No puedo pensar qué más probar en ese tipo.

Aquí está mi código simplificado. (DVG es mi DataGridView en el formulario).

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

    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta