Ссылка на обновление бизнес-объекта комбинированного списка данных - PullRequest
2 голосов
/ 29 сентября 2010

Я недавно задал этот вопрос здесь и получил ответ.Однако сейчас я пытаюсь применить ту же логику к DataGridView, который связан с BindingList объектов Curriculum.Класс Curriculum имеет свойство типа Year.Я пытаюсь использовать ComboBoxColumn для обновления ссылки, которую объект учебной программы имеет в годах.

Поле comboboxcolumn привязано к BindingList лет, поэтому возникает ошибка, если я задаю либо элемент отображения, либо значениечлен, поэтому я оставил их пустыми.При этом просмотр данных успешно загружается и корректно отображает данные (я переопределил метод ToString для класса year).Однако, если я выберу другой объект года из выпадающего списка, как только он завершит редактирование, он выдаст исключение, сказав, что не может преобразовать строку в тип year.

Похоже, мне нужен TypeConverter для этого, но проблема в том, что комбинированный список отображает описательное значение, которое, я не могу гарантировать, будет уникальным для объекта этого года - поэтому у меня нет способа получитьобъект года из заданной строки.

У кого-нибудь есть опыт в подобных ситуациях, это должно быть довольно распространенным явлением, но в этом случае Google не помог мне.

Марлон

1 Ответ

3 голосов
/ 11 января 2011

Та же проблема, что и здесь . Похоже, что привязка объекта в столбце комбинированного списка не работает должным образом, и вы должны указать ValueMember.

Для конкретного проекта, над которым я работаю, я пришел к выводу, что не стоит реализовывать собственный дескриптор типа, поэтому вместо этого я использую довольно ужасный хак:

В сущности, к которой я привязан, у меня есть следующее:

class TestEntity
{
    public TestEntity BindingHack_ValueMember
    {
        get
        {
           return this;
        }
    }
    public string BindingHack_DisplayMember
    {
        get
        {
            return this.ToString();
        }
    }
}

И привязка данных для столбца выглядит так:

column.DataPropertyName = "Foo";
column.DisplayMember = "BindingHack_DisplayMember";
column.ValueMember = "BindingHack_ValueMember";

Возможно, немного некрасиво, но это работает ...

...