![](/img/trans.png)
[英]Adding new row in DataGridView doesn't add to BindingList<T>
[英]DataGridView doesn't update Enum in BindingList
我的DataGridView
的DataSource是一个BindingList<Filter>
,其中包含一个枚举。 gridview仅包含两列:用于字符串的常规文本框列和用于枚举的组合框(下拉)列。 如果将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
。
如果我保持这一行, colFilterType.DataPropertyName = "type";
每当创建新行或将鼠标悬停在下拉列表上时,都会出现以下错误。 如果我摆脱了它,则每个新创建的过滤器的type
都设置为0
并且从不更新。
我不确定是什么原因导致DataError事件,所以不知道如何处理它或在哪里断点。
问题是当您专注于新行(准备添加新行)时,基础列表中需要一个新对象,该对象默认为null
,该值绑定到新行,并且ComboBoxCell
当然可以不接受该空值,导致您遇到异常。 实际上,解决方案非常简单,我们只需要处理BindingList
的事件AddingNew
,将其中的默认新对象设置为有效值,然后就可以正常工作:
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 };
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.