Ошибка 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).

Другие вопросы по тегам