У меня есть программно заполненный DataGridView с некоторыми DataGridViewComboBoxColumn
записями.Эти ComboBox содержат пользовательские типы, у которых ToString()
перезаписаны, чтобы скрыть свои внутренние кишки от пользователя.
Проблема: всякий раз, когда я изменяю значение ComboBox и выбираю другую ячейку, вызывается CellValidating
,FormattedValue - это строковый результат моего пользовательского FooBar.ToString () (должно быть в порядке).В CellEndEdit
ValueType внезапно становится строкой, а не моим пользовательским типом, и я получаю сообщение об ошибке либо при просмотре row.Cell-Member в VS, либо при наведении курсора на измененную ячейку (перевод с немецкого):
"DataGridView-Exception: System.ArgumentException
: DataGridViewComboBoxCell
-Value недопустимо. Обработайте DataError-Exception, чтобы заменить это диалоговое окно"
Вот как создается столбец - colFoo DataGridViewComboBoxColumn
:
dataGridInstance.Columns[1].CellTemplate.Value = new FooBar("bla", 31);
dataGridInstance.Columns[1].CellTemplate.ValueType = typeof(FooBar);
foreach (FooBar foo in FooBarArray)
colSymbol.Items.Add(sym);
Сетка заполняется так:
foreach (FooLine line in SomeFooLineArray)
{
DataGridViewRow newRow = ((DataGridViewRow)dataGridInstance.RowTemplate.Clone());
newRow.Cells[1].Value = line.Foo; // FooBar instance field
dataGridInstance.Rows.Add(newRow);
}
Любые эксперименты в CellValidating
или CellFormatting
провалились, я всегда получаю это сообщение.
Как я могу добавить пользовательские типы в существующий DataGridView
без перезаписи?Почти каждый другой Компонент (включая выпадающие списки) просто отлично поддерживает пользовательские типы, проблема заключается только в копировании значения из Combo в швы сетки.
Как уже было сказано, реализация FooBar выглядит следующим образом:
internal class FooBar {
private readonly int id;
private readonly string name;
internal FooBar(string n, int i)
{
id = i; name = n;
}
public override string ToString()
{
return name;
}
}
Это делает немного больше, но это инкапсулированная значимая функциональность.