многозначный элемент управления привязкой данных в WinForms DataGridView

#.net #winforms #datagridview

#.net #winforms #datagridview

Вопрос:

Я пытаюсь реализовать выпадающий список с несколькими вариантами выбора в DataGridView (WinForms). Я создал довольно простой элемент управления, производный от OwnerDraw ComboBox, который, похоже, работает нормально. Затем я разместил этот элемент управления внутри DataGridView, создав класс, производный от DataGridViewColumn . Все отображается нормально. Проблема, с которой я сталкиваюсь, связана с привязкой данных к новому столбцу.

Источником данных DataGridView является список привязок<MyObject>. MyObject имеет свойство MyProperty, которое является списком привязок<long> . Я передаю отдельный источник данных в MultiSelectComboBox и устанавливаю DisplayMember и ValueMember, чтобы поле со списком действовало правильно, просматривая описание значений в MyProperty (ValueMember — длинный идентификатор, DisplayMember — строковое описание).

Проблема, с которой я сталкиваюсь, возникает, когда DataGridView пытается передать значение обратно в источник данных. MultiSelectComboBox предоставляет свойство SelectedValues типа List<object>. Я установил значение ячейки в это значение. Поскольку ValueMember именует свойство long, объект, передаваемый обратно, на самом деле является списком <long> . Я получаю InvalidCastException, когда фреймворк пытается выполнить преобразование из List<long> в BindingList<long> . Предположительно, это связано с тем, что привязка данных пытается установить MyProperty в значение ячейки.

Кто-нибудь может дать мне несколько подсказок относительно того, как должна работать привязка к списку привязок? Должен ли элемент управления, размещенный в ячейке (мой MultiSelectComboBox), просматривать свою привязку к данным и вести себя по-другому, если он привязан к списку привязок, или есть какая-то поддержка в рамках, которая может здесь помочь?

Ответ №1:

Вы пытались передать его в свой конструктор BindingList следующим образом:

 BindingList<long> myBindingList= new BindingList<long>(myList);