DataGridView не обновляет Enum в BindingList

Источник данных моего DataGridView это BindingList<Filter> который содержит перечисление. Вид сетки содержит только два столбца: обычный столбец текстового поля для строки и столбец комбинированного списка (раскрывающийся список) для перечисления. Если я связываю столбец combobox с переменной enum моего объекта, я получаю ошибку. Вот код для моих объектов:

public class FilterProfile
{
   public FilterProfile()
   {
      filters = new BindingList<Filter>();  // the list that gets bound to gridview
   }
   public string name { get; set; }
   public BindingList<Filter> filters { get; set; }
}

public class Filter
{
  public string keyword { get; set; }
  public FilterType type { get; set; }  // the enum in question
}

public enum FilterType : int
{
  SESSION = 1,
  ORDER = 2,
  SHIPMENT = 3
}

У меня есть форма, где пользователь выбирает FilterProfile из выпадающего меню, а затем я нахожу соответствующий FilterProfile из глобального списка и связать его:

foreach (PlvFilterProfile filterProfile in _filterProfiles)
     {  
        // find the correct filter profile
        if (filterProfile.name.Equals(lstFilterProfiles.Text))
        {
           // bind it
           grdFilters.DataSource = filterProfile.filters;
           break;
        }
     }

Чтобы изменения, сделанные в DataGridView, были отражены в filterProfile.filters Мне нужно установить DataPropertyName атрибут обоих столбцов к их соответствующей переменной (либо keyword или же type). Это работает правильно для keyword строка, но не с type ENUM.

Если я буду придерживаться линии colFilterType.DataPropertyName = "type"; Я получаю сообщение об ошибке ниже при создании новой строки или при наведении мыши на выпадающий список. Если я избавлюсь от этого, то type каждого вновь созданного фильтра 0 и никогда не обновляется.

Я не уверен, что вызывает событие DataError, поэтому не знаю, как его обработать или где установить точку останова.

1 ответ

Решение

Проблема в том, что когда вы фокусируете внимание на новой строке (готовитесь к добавлению новой строки), в базовом списке требуется новый объект, этот объект по умолчанию nullэто значение связано с новой строкой и, конечно же, ComboBoxCell не может принять это нулевое значение, в результате чего возникла исключительная ситуация. Решение действительно очень простое, нам просто нужно обработать событие AddingNew из BindingListУстановите для нового объекта по умолчанию действительное значение, и тогда оно будет работать нормально:

public FilterProfile()
{
  filters = new BindingList<Filter>();  // the list that gets bound to gridview
  filters.AddingNew += (s,e) => {
    //the default value of FilterType is up to you.
    e.NewObject = new Filter {type = FilterType.SESSION };
  };
}
Другие вопросы по тегам