Ячейка Datagridview со списком, принимающая enum как целое число

Я попытался переопределить поведение по умолчанию для столбца со списком ящиков datagridview, чтобы он принимал enum как int. Для этого я создал CustomComboboxCell а также CustomComboboxEditingControl следующим образом:

public class CustomComboboxEditingControl : DataGridViewComboboxEditingControl
{
    public override object EditingControlFormattedValue
    {
        get
        {
            return base.EditingControlFormmatedValue;
        }
        set
        {
            if(value.GetType().IsEnum)
            {
                //convert enum to int
                base.EditingControlFormattedValue = (int)value;
            }
            else
            {
                base.EditingControlFormattedValue = value;
            }
        }
    }
}

public class CustomComboboxCell : DatagridviewComboboxCell
{
    public override Type EditType
    {
        return typeof(CustomComboboxEditingControl);
    }
}

Затем в своей форме я создаю сетевое представление со столбцом комбинированного списка, чтобы проверить это:

public enum TestEnum
{
    a = 1,
    b = 2,
    c = 3,
}

public class Test
{
    public TestEnum test {get;set;}
}

public class Form1
{
    public Form1
    {
        Datagridview dgv = new Datagridview();
        dgv.AutoGenerateColumns = false;

        DatagridviewComboboxColumn col1 = new DatagridviewComboboxColumn();
        col1.CellTemplate = new CustomComboboxCell();

        //set datasource for col1
        Dictionary<int, string> dct = new Dictionary<int, string>();
        dct.Add(1, "a");
        dct.Add(2, "b");
        dct.Add(3, "c");

        col1.Datasource = new BindingSource() {Datasource = dct};
        col1.ValueMember = "key";
        col1.DisplayMember = "value";
        col1.DataPropertyName = "test";

        dgv.Columns.Add(col1);
        dgv.Invaidate();

        this.Constrols.Add(dgv);

        //Add datasource for datagridview
        List<Test> lst = new List<Test>();
        lst.Add(new Test() {test = TestEnum.a});
        lst.Add(new Test() {test = TestEnum.b});
        lst.Add(new Test() {test = TestEnum.c});

        dgv.Datasource = new BindingList() {Datasource = lst};
    }
}

Я думаю, что все выглядит идеально, но когда я запускаю форму, это все равно дает мне System.ArgumentException: DataGridViewComboboxCell value is not valid.

Пожалуйста, посмотрите на мой код и скажите, что я пропустил?

1 ответ

Решение

После борьбы за ночь, в конце концов, я в конечном итоге исправляю это "отвратительным" обходным путем, который я не хочу с самого начала. Я просто переключаюсь с использования Dictionary<int, string> в Dictionary<TestEnum, string> как источник данных

Другие вопросы по тегам