DataGridView verknüpft mit DataTable mit Combobox-Spalte basierend auf Aufzählung

Nachdem ich gestern viel nach diesem gesucht habe, muss ich aufgeben.

Ich habe ein DataGridView mit einer Datentabelle verknüpft. Eine der Spalten ist eine Aufzählung und ich möchte, dass diese als Combobox-Spalte angezeigt wird.

Ich habe diesen Link gefundenErstellen Sie Dropdown-Listenoptionen aus einer Aufzählung in einer DataGridView Das hat eine Antwort auf die Verwendung der folgenden ...

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

Ich habe das versucht, aber wenn der Benutzer einen neuen Datensatz erstellt, eine Option aus dem Dropdown-Menü auswählt (die richtigen Optionen werden angezeigt) und dann das Feld verlässt, wird die Meldung "DataGridViewComboBoxCel-Wert ist ungültig" angezeigt. Ich habe bei der Suche einige Lösungen gefunden, die beschreiben, wie man diesen Fehler abfängt und dann nichts unternimmt (wodurch der Fehler ausgeblendet wird), aber ich möchte ihn lösen und nicht nur ausblenden. Wenn der Benutzer die Nachricht mit OK bestätigt, wird sie noch zweimal wiederholt.

Ich habe auch Lösungen gesehen, die die Werte in der Aufzählung durchlaufen und eine Datentabelle erstellen, die das int und den String für jeden enthält, und dann die Datentabelle als Datenquelle in der Combo verwenden. Ich habe in der Vergangenheit eine Datentabelle als Quelle für eine Combobox verwendet, wenn ich mit einer Back-End-MSSQL-Datenbank gearbeitet habe.

Eine andere Variante ist das Durchschleifen und Schreiben direkt in die Combo wie diese ...

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

wie in der Frage in diesem Link.Wie kann ich einer Combobox einige Enum-Werte hinzufügen?

MEINE FRAGE: Kann mit Enum.GetValues ​​(typeof (MyEnum)) zum Funktionieren gebracht werden? Methode? Die datierbare Methode scheint langwierig. Die Schleife dann mit MyComboColumn.Items.Add (barName); ist auch etwas langwierig und führt dazu, dass die String-Version der Enumeration in der Datentabelle aufgezeichnet wird, nicht die ganze Zahl (und ich würde eher, dass es die ganze Zahl war).

Ich kann keine Beispiele für die Methode Enum.GetValues ​​(typeof (MyEnum)) finden, bei der das Raster mit einer Datentabelle verknüpft ist. Wenn ich danach suche, stoße ich einfach auf die anderen Methoden.

Ich denke, das Problem liegt wahrscheinlich im Datentyp in der zugrunde liegenden Tabellenspalte. Ich habe versucht, dies als Ganzzahl, als Zeichenfolge und ich habe versucht, es nicht zu definieren. Ich kann mir nicht vorstellen, was ich sonst noch an diesem Typ ausprobieren könnte.

Hier ist mein vereinfachter Code. (DVG ist mein DataGridView im Formular).

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

    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage