How do you sort an EntitySet

后端 未结 4 819
醉梦人生
醉梦人生 2021-01-24 14:33

The MSDN documentation states that an EntitySet implements IBindingList

(see \'Binding to EntitySets\' at http://msdn.microsoft.com/en-us/library/bb546190.aspx)

4条回答
  •  悲哀的现实
    2021-01-24 14:49

    EntitySet doesn't implement IBindingList...it provides a method to get an IBindingList. You need to call .GetNewBindingList() to get an instance of EntitySetBindingList, which derives from SortableBindingList, which is a BindingList. EntitySetBindingList is just a wrapper around the original EntitySet it was created from, so any modifications to it are modifications to the original EntitySet.

    EDIT: Sorting with BindingList:

    To sort with a BindingList, you need to expose some kind of interface to allow sorting. Sorting is supported within the BindingList class, but its through protected properties and methods. It should be possible to expose an expressive sort method with a wrapper:

    public class EntitySetBindingWrapper: BindingList
    {
        public EntitySetBindingWrapper(BindingList root) : base(root)
        {
        }
    
        public void Sort(Expression> expr, ListSortDirection direction)
        {
            if (expr == null)
                base.RemoveSortCore();
    
            MemberExpression propExpr = expr as MemberExpression;
            if (propExpr == null) throw new ArgumentException("You must provide a property", "expr");
    
            PropertyDescriptorCollection descriptorCol = TypeDescriptor.GetProperties(typeof(T));
            IEnumerable descriptors = descriptorCol.Cast();
            PropertyDescriptor descriptor = descriptors.First(pd => pd.Name == propExpr.Member.Name);
    
            base.ApplySortCore(descriptor, direction);
        }
    }
    

    You should then be able to sort like so:

    var bindingWrapper = new EntitySetBindingWrapper(myEntitySet.GetNewBindingList());
    bindingWrapper.Sort(e => e.MyProperty, ListSortDirection.Ascending);
    
    listView.DataSource = bindingWrapper;
    

    There might be additional implementation for the EntitySetBindingWrapper class...such as fortwarding any normally public methods on BindingList to the one provided to the constructor.

提交回复
热议问题