Ошибка DataGridView по умолчанию для столбца ComboBox
У меня есть DataGridView в моем приложении.NET 4.5 WinForms с двумя столбцами. Один столбец - это обычный столбец текстового поля, а другой - DataGridViewComboBoxColumn
это выпадающий список Я пытаюсь привязать столбцы к BindingList
из моего Filter
объект, и я хотел бы все внутри перечисления FilterType
чтобы показать в раскрывающемся списке. Вот код для моего объекта и перечисления:
public class Filter
{
public string keyword { get; set; }
public FilterType type { get; set; }
}
public enum FilterType : int //the strings should appear in the dropdown
{
SESSION = 1,
ORDER = 2,
SHIPMENT = 3
}
Я вручную создал столбцы в конструкторе VS 2012, где я изменил ColumnType
, HeaderText
, а также DataPropertyName
в keyword
а также type
,
Используя ответ, который я нашел здесь, я добавил эти две строки кода в событие загрузки формы:
colFilterType.DataSource = Enum.GetValues(typeof(FilterType));
colFilterType.ValueType = typeof(FilterType);
Когда я запускаю код, я первоначально вижу пустую строку. Всякий раз, когда я нажимаю на строку, независимо от того, в каком столбце щелкнули, я получаю всплывающую ошибку.
System.ArgumentException: значение DataGridViewComboBoxCell недопустимо.... обработайте событие DataError
Я могу проигнорировать это и напечатать любой текст, который я хочу в Keyword
столбец, и выпадающий список волшебным образом заполняется первым значением перечисления. Однако, если я даже наведу курсор мыши на выпадающий список, снова появится ошибка (см. Скриншот). Я не уверен, что вызывает ошибку, и не знаю, где установить точку останова. Я также не знаю, создаю ли я проблему, создавая части DataGridView в конструкторе и изменяя их в коде. Дизайнер не позволяет мне установить DataSource
как я делал в коде. Он также содержит поле ValueMember
что я не видел, используется в коде.
Хотя это и не идеально, я не возражаю против того, чтобы поймать ошибку и ничего не делать с ней, поскольку раскрывающийся список, кажется, заполняется сам (и при условии, что все данные остаются нетронутыми).
1 ответ
Ваш код работает нормально при добавлении столбца во время выполнения. Образец кода:
DataGridViewComboBoxColumn colFilterType = new DataGridViewComboBoxColumn();
colFilterType.HeaderText = "Name you want";
colFilterType.DataSource = Enum.GetValues(typeof(FilterType));
colFilterType.ValueType = typeof(FilterType);
dataGridView1.Columns.Add(colFilterType);
Ошибки, подобные той, о которой вы сообщаете, обычно вызываются при изменении типа ячейки / столбца во время выполнения из-за большого количества событий, которые запускаются каждый раз, когда DataGridView
затрагивается любым образом: некоторые из них ожидают старый тип и находят элементы с новым (например, ожидая int
и найти string
).