我的DataGridView
的数据源是BindingList<Filter>
,其中包含枚举。 gridview只包含两列:字符串的常规文本框列和枚举的组合框(下拉列)。如果我将组合框列绑定到我的对象的枚举变量,我会收到错误。这是我的对象的代码:
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
或{{1 }})。这适用于type
字符串,但不适用于keyword
枚举。
如果我保留行type
,无论何时创建新行或每次将鼠标放在下拉列表上,我都会收到错误。如果我摆脱它,每个新创建的过滤器的colFilterType.DataPropertyName = "type";
都设置为type
并且永远不会更新。
我不确定导致DataError事件的原因是什么,所以不知道如何处理它或断点到哪里。
答案 0 :(得分: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 };
};
}