2013-12-03 2 views
1

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

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, но не с перечислением .

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

enter image description here

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

+0

вызвать dataerror событие в DataGridView в C# – SK2185

ответ

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 }; 
    }; 
} 
+1

Удивительный! Как я могу удвоить этот ответ? Отличное объяснение проблемы и решения. Иногда C# требует немного волшебного кода для работы. – valsidalv

Смежные вопросы