繁体   English   中英

DataGridView不会更新BindingList中的Enum

[英]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属性设置为其各自的变量( keywordtype )。 这对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM