C# 实现DataGridView自动排序

新建类

    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)
        {

            //MessageBox.Show(type.GetType().ToString());
            if (o1 == null) return o2 == null ? 0 : -1;
            if (o2 == null) return 1;
            if (type.ToString().Contains("Int")) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));//注意这里if (type.IsPrimitive || type.IsEnum)是取不到Int型的
            if (type == typeof(DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);
            return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
        }
  使用:(直接把查询出来的List<>扔进去即可)
dataGridView1.DataSource = new App_Code.SortableBindingList<App_Code.WordCount>(new App_Code.WorldCountDA().SelectAll());

还没试过日期

 
时间: 2024-10-10 02:32:46

C# 实现DataGridView自动排序的相关文章

DataGridView点击排序完成后如何禁止自动排序

Summary: Disable sorting after clicking DataGridView columnheader,Prevent databound DataGridView from sorting while editing! Problem:I have a databound DataGridView in a WinForms which the user may have sorted by a column. The problem is this: after

IOS数组自动排序

self.beacons = [beacons sortedArrayUsingComparator:^NSComparisonResult(BRTBeacon* obj1, BRTBeacon* obj2){ return obj1.distance.floatValue>obj2.distance.floatValue?NSOrderedDescending:NSOrderedAscending; }]; 数组的自动排序: 通过比较的方法进行   排序

使用CollectionViewSource,通过Xaml绑定自动排序

这个是一个完成分组和排序功能的Datagrid,同样只是简单的绑定到List集合,后台不用额外的代码,所有功能都在Xaml中完成: 首先在UI中定义CollectionViewSource资源,在这里定义排序和分组的规则 WPF中定义如下: 引入命名空间:xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" <Window.Resources> <CollectionViewSourc

如何不让DataGridView自动生成列

如果不想让DataGridView自动生成与数据源对应的列, 只需要把属性AutoGenerateColumns设为false即可. 需要注意: 在界面设计的属性窗口中是看不到AutoGenerateColumns属性的, 需要在代码中设定,比如在窗口的构造函数中设定:dataGridView1.AutoGenerateColumns = false;

DBGrideh 实现自动排序

一.点击标题自动排序 1.在optioneh中设置:AutosortMarking:=True2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)sortlocal:=True;3.uses 单元Ado------ehlibADoTclientData------ehlibCDSBDE ---------ehlibBDE EhLibUniDAC 4.Column属性 ColumDefValues->Title->TitleButton设为TRUE 二.+序列号

TreeSet实现自动排序的原理

今天随手了一段代码关于通过treeSet实现自动排序的功能,自己折腾了好久. 始终是存在这一些疑惑,后来和同学的交流和调试可以解释自动排序的基本原理: 通过可以通过两种方式实现自动排序: 一种: package xyxysjxy.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io

委托+拉姆达=自动排序(一)

我们总能看到和使用到根据字段排序的功能,也就是文件资源管理器中的点击自动排序的效果:             要实现这个功能首先必须在界面的html代码中进行如下设置: 即:为要排序的字段设置:sortable属性,也就是将该字段设置为可排序. 既然是界面的排序,就必须存在一个参数,向后台调取相应的方法返回数据到界面,那么方法有二: 1.将要排序的字段作为参数,层层传递,到后台调取方法: <span style="font-size:18px;"> //获取sort时,如果

map&lt;String ,String&gt; 自动排序 升序

//TreeMap自动排序 Map<String, String> params = new TreeMap<String, String>( new Comparator<String>() { public int compare(String obj1, String obj2) { // 升序排序 return obj1.compareTo(obj2); } });

DataGridView列排序混乱的处理方法

在C#程序开发中DataGridView可以说是使用最多的数据呈现控件了,但是在使用的过程中我们会发现当绑定的数据源有较多数据列的时候,DataGridView上显示的列的顺序就会出现混乱的现象. 那我们该如何解决这个问题呢?其实只要设置下面的代码就可以了,相当的简单. 1 this.dataGridView1.AutoGenerateColumns = false; 2 this.dataGridView1.DataSource = datatable; 不过需要注意的是这2条代码的先后顺序,