DataGridView połączony z DataTable z kolumną Combobox opartą na wyliczeniu

Spędziłem wiele wczoraj na szukaniu tego i muszę się poddać.

Mam DataGridView połączony z Datatable. Jedna z kolumn jest enum i chcę, aby pokazała się jako kolumna Combobox.

Znalazłem ten linkUtwórz opcje rozwijanej listy z wyliczenia w DataGridView który ma odpowiedź na temat używania następujących ...

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

Próbowałem tego, ale gdy użytkownik tworzy nowy rekord, wybiera opcję z listy rozwijanej (pokazuje prawidłowe opcje), a następnie przesuwa się poza pole, otrzymuje komunikat „Wartość DataGridViewComboBoxCel jest niepoprawna”. Znalazłem kilka rozwiązań w wyszukiwaniu tego gadania o tym, jak pułapkować ten błąd, a następnie nic nie robić (ukrywając błąd), ale chcę go rozwiązać, nie tylko go ukryć. Jeśli użytkownik OK to wiadomość, otrzymają ją powtórzyć jeszcze dwa razy.

Widziałem także rozwiązania, które przechodzą przez wartości w enum i tworzą datatable zawierające int i ciąg znaków dla każdego z nich, a następnie używając datatable jako źródła danych w combo. Użyłem datatable jako źródła combobox w przeszłości podczas pracy z back-endową bazą danych MSSQL.

Innym wariantem tego jest przejście przez pętlę i zapis bezpośrednio do combo takiego jak to ...

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

tak jak w pytaniu w tym linku.Jak mogę dodać kilka wartości Enum do combobox

MOJE PYTANIE: Czy można go uruchomić, używając Enum.GetValues ​​(typeof (MyEnum)); metoda? Metoda datatable wydaje się długa. Zapętlenie, a następnie użycie MyComboColumn.Items.Add (barName); jest również nieco długo zwijany i spowoduje, że wersja ciągu enum zostanie zapisana w datatable, a nie w liczbie całkowitej (i wolałbym, aby była to liczba całkowita).

Nie mogę znaleźć przykładów metody Enum.GetValues ​​(typeof (MyEnum)), w której siatka jest połączona z datatable. Kiedy szukam, po prostu natrafiam na inne metody.

Myślę, że problem prawdopodobnie leży w typie danych w podstawowej kolumnie tabeli. Próbowałem tego jako liczby całkowitej, jako łańcucha i próbowałem go nie definiować. Nie mogę myśleć, co jeszcze spróbować na tym typie.

Oto mój uproszczony kod. (DVG to mój DataGridView na formularzu).

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