读书人

:为什么DataGridView绑定集合后不能排

发布时间: 2012-05-15 14:35:29 作者: rapoo

高手请进:为什么DataGridView绑定集合后不能排序?
如题,我用一个List<xxx> 的泛型对象跟一个datagridview 绑定(用DataSource),没问题,数据也显示出来了。
但奇怪的是,在点列标头的时候,不能排序了。不知道大家有没遇到过这样的问题,怎么解决?

[解决办法]
写一个SortableBindingList <T> :BindingList <T> ,把需要排序的List <T> 改成用SortableBindingList <T>
SortableBindingList的完整代码如下,使用时如下:

DataSet ds = ToDataSet<UserInfo>(test.GetUserInfoCollection());
SortableBindingList<UserInfo> list = DataSetToIList<UserInfo>(ds, 0);//要排序的List<T>改成SortableBindingList就可以了
dataGridView1.DataSource = list;


C# code
        public class SortableBindingList<T> : BindingList<T>        {            private bool isSortedCore = true;            private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;            private PropertyDescriptor sortPropertyCore = null;            private string defaultSortItem;            public SortableBindingList() : base() { }            public SortableBindingList(IList<T> list) : base(list) { }            protected override bool SupportsSortingCore            {                get { return true; }            }            protected override bool SupportsSearchingCore            {                get { return true; }            }            protected override bool IsSortedCore            {                get { return isSortedCore; }            }            protected override ListSortDirection SortDirectionCore            {                get { return sortDirectionCore; }            }            protected override PropertyDescriptor SortPropertyCore            {                get { return sortPropertyCore; }            }            protected override int FindCore(PropertyDescriptor prop, object key)            {                for (int i = 0; i < this.Count; i++)                {                    if (Equals(prop.GetValue(this[i]), key)) return i;                }                return -1;            }            protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)            {                isSortedCore = true;                sortPropertyCore = prop;                sortDirectionCore = direction;                Sort();            }            protected override void RemoveSortCore()            {                if (isSortedCore)                {                    isSortedCore = false;                    sortPropertyCore = null;                    sortDirectionCore = ListSortDirection.Ascending;                    Sort();                }            }            public string DefaultSortItem            {                get { return defaultSortItem; }                set                {                    if (defaultSortItem != value)                    {                        defaultSortItem = value;                        Sort();                    }                }            }            private void Sort()            {                List<T> list = (this.Items as List<T>);                list.Sort(CompareCore);                ResetBindings();            }            private int CompareCore(T o1, T o2)            {                int ret = 0;                if (SortPropertyCore != null)                {                    ret = CompareValue(SortPropertyCore.GetValue(o1), SortPropertyCore.GetValue(o2), SortPropertyCore.PropertyType);                }                if (ret == 0 && DefaultSortItem != null)                {                    PropertyInfo property = typeof(T).GetProperty(DefaultSortItem, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.IgnoreCase, null, null, new Type[0], null);                    if (property != null)                    {                        ret = CompareValue(property.GetValue(o1, null), property.GetValue(o2, null), property.PropertyType);                    }                }                if (SortDirectionCore == ListSortDirection.Descending) ret = -ret;                return ret;            }            private static int CompareValue(object o1, object o2, Type type)            {                                if (o1 == null) return o2 == null ? 0 : -1;                else if (o2 == null) return 1;                else if (type.IsPrimitive || type.IsEnum) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));                else if (type == typeof(DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);                else return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());            }        } 

读书人网 >C#

热点推荐