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