DataGridView不会更新BindingList中的Enum

时间:2013-12-03 22:39:46

标签: c# winforms datagridview enums .net-4.5

我的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并且永远不会更新。

enter image description here

我不确定导致DataError事件的原因是什么,所以不知道如何处理它或断点到哪里。

1 个答案:

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