DataGridViewComboBoxColumn всегда должен иметь все возможные значения в списке элементов комбинированного списка, иначе будет выдано «FormatException: значение DataGridViewComboBoxCell недопустимо».
Если вы пытаетесь вернуть значения, выбранные из одного столбца комбинированного списка, вы можете обработать событие DataGridView CellParsing и получить выбранный элемент из DataGridView.EditingControl, поскольку он будет установлен для редактирования элемента управления из редактируемого столбца. Вот пример:
private void dataGridView1_CellParsing(object sender,
DataGridViewCellParsingEventArgs e) {
if (dataGridView1.CurrentCell.OwningColumn is DataGridViewComboBoxColumn) {
DataGridViewComboBoxEditingControl editingControl =
(DataGridViewComboBoxEditingControl)dataGridView1.EditingControl;
e.Value = editingControl.SelectedItem;
e.ParsingApplied = true;
}
}
Вы также можете настроить способ отображения объектов в каждой ячейке, обрабатывая событие форматирования ячейки. Вот код, который отображает toString для любого объекта или интерфейса.
private void dataGridView1_CellFormatting(object sender,
DataGridViewCellFormattingEventArgs e) {
if (e.Value != null) {
e.Value = e.Value.ToString();
e.FormattingApplied = true;
}
}
Обработка этих двух событий должна быть достаточной для показа и редактирования данных в любом бизнес-объекте и его лёгком, а затем писать преобразователи типов. Для этой работы установите DataGridView и столбец комбинированного списка следующим образом:
var data = (from item in someTable
select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList ();
Нет необходимости устанавливать свойство DisplayMember или ValueMember, просто убедитесь, что в списке источников данных в выпадающем списке есть все возможные значения для Foo.
Надеюсь, это поможет.