DataGridView邦定排序问题的解决

转帖|其它|编辑:郝浩|2008-09-27 13:55:23.000|阅读 2390 次

概述:DataGridView邦定排序问题的解决

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

本人在做项目的时候将业务层得到的IList<T>邦定到DataGridView时发现不支持排序.由于业务层返回的数据是IList<T>,而且不能修改业务层.所以只好重写一个List类来继承BindingList来实现该功能.

public class SortableBindingList<T> :BindingList<T>
    {
        private ListSortDirection sortDirection = ListSortDirection.Ascending;
        private PropertyDescriptor propertyDescriptor;
        private bool isSorted;

        protected override bool SupportsSortingCore
        {
            get
            {
                return true;
            }
        }
        protected override PropertyDescriptor SortPropertyCore
        {
            get
            {
                return propertyDescriptor;
            }
        }
        protected override ListSortDirection SortDirectionCore
        {
            get
            {
                return sortDirection;
            }
        }
        protected override bool IsSortedCore
        {
            get
            {
                return isSorted;
            }
        }

        public SortableBindingList() : base() { }
        public SortableBindingList(IList<T> t) : base(t) { }

        private PropertyDescriptor GetPropertyDescriptor(string propertyName)
        {
            bool findName = false;
            PropertyDescriptorCollection propertyCollection = TypeDescriptor.GetProperties(typeof(T));
            foreach (PropertyDescriptor item in propertyCollection)
            {
                if (item.Name == propertyName)
                {
                    findName = true;
                    return item;
                }
            }
            if (!findName)
            {
                throw (new Exception("排序字段名不存在!"));
            }
            else
                return null;
        }

        protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
        {
            propertyDescriptor = prop;
            sortDirection = direction;
            InnerSort();
            isSorted = true;
        }

        private void InnerSort()
        {
            List<T> list = (this.Items as List<T>);
            list.Sort(Compare);
            ResetBindings();
        }

        private int Compare(T x, T y)
        {
            if (sortDirection == ListSortDirection.Descending)
                return CompareValue(propertyDescriptor.GetValue(y),propertyDescriptor.GetValue(x));
            else
                return CompareValue(propertyDescriptor.GetValue(x), propertyDescriptor.GetValue(y));
        }

        public void Sort(string sortPropertyName, bool isAscending)
        {
            if (isAscending)
                sortDirection = ListSortDirection.Ascending;
            else
                sortDirection = ListSortDirection.Descending;
            propertyDescriptor = GetPropertyDescriptor(sortPropertyName);
            ApplySortCore(propertyDescriptor, sortDirection);
        }

        static int CompareValue(object o1, object o2)
        {
            if (o1 == null) return o2 == null ? 0 : -1;
            else if (o2 == null) return 1;
            else if (o1 is IComparable)return ((IComparable)o1).CompareTo(o2);
            else if (o2 is IComparable) return ((IComparable)o2).CompareTo(o1);
            else return o1.ToString().CompareTo(o2.ToString());
        }
    }


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:DIY部落

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP