winform datagridview 绑定泛型集合变得不支持排序的解决方案

              原文: winform datagridview 绑定泛型集合变得不支持排序的解决方案

              案例:

                环境:Winform程序

                控件:Datagridview

                现象:Datagridview控件绑定到List<T>泛型数据上不支持排序

                   Datagridview控件绑定到DataTable上可以支持排序

                结论:泛型会使Datagridview失去排序特性

                解决:实现BindingList<T>接口

                实现代码:

                

              分享图片
              复制代码
                1 using System;
                2 using System.Collections.Generic;
                3 using System.ComponentModel;
                4 using System.Linq;
                5 using System.Reflection;
                6 using System.Text;
                7 
                8 namespace HOET.Plugins.Orders.Model
                9 {
               10     /// <summary>
               11     /// 泛型会失去DataTable特性,DataGridView绑定List<T>后不支持排序
               12     /// </summary>
               13     /// <typeparam name="T"></typeparam>
               14     class SortableBindingList<T> : BindingList<T>
               15     {
               16         private bool isSortedCore = true;
               17         private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
               18         private PropertyDescriptor sortPropertyCore = null;
               19         private string defaultSortItem;
               20 
               21         public SortableBindingList() : base() { }
               22 
               23         public SortableBindingList(IList<T> list) : base(list) { }
               24 
               25         protected override bool SupportsSortingCore
               26         {
               27             get { return true; }
               28         }
               29 
               30         protected override bool SupportsSearchingCore
               31         {
               32             get { return true; }
               33         }
               34 
               35         protected override bool IsSortedCore
               36         {
               37             get { return isSortedCore; }
               38         }
               39 
               40         protected override ListSortDirection SortDirectionCore
               41         {
               42             get { return sortDirectionCore; }
               43         }
               44 
               45         protected override PropertyDescriptor SortPropertyCore
               46         {
               47             get { return sortPropertyCore; }
               48         }
               49 
               50         protected override int FindCore(PropertyDescriptor prop, object key)
               51         {
               52             for(int i = 0; i < this.Count; i++)
               53             {
               54                 if(Equals(prop.GetValue(this[i]),key))
               55                 {
               56                     return i;
               57                 }
               58             }
               59 
               60             return -1;
               61         }
               62 
               63         protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
               64         {
               65             isSortedCore = true;
               66             sortPropertyCore = prop;
               67             sortDirectionCore = direction;
               68             Sort();
               69         }
               70 
               71         protected override void RemoveSortCore()
               72         {
               73             if(isSortedCore)
               74             {
               75                 isSortedCore = false;
               76                 sortPropertyCore = null;
               77                 sortDirectionCore = ListSortDirection.Ascending;
               78                 Sort();
               79             }
               80         }
               81 
               82         public string DefaultSortItem
               83         {
               84             get
               85             {
               86                 return defaultSortItem;
               87             }
               88             set
               89             {
               90                 if(defaultSortItem != value)
               91                 {
               92                     defaultSortItem = value;
               93                     Sort();
               94                 }
               95             }
               96         }
               97 
               98         private void Sort()
               99         {
              100             List<T> list = this.Items as List<T>;
              101             list.Sort(CompareCore);
              102             ResetBindings();
              103         }
              104 
              105         private int CompareCore(T o1, T o2)
              106         {
              107             int ret = 0;
              108             if(SortPropertyCore != null)
              109             {
              110                 ret = CompareValue(SortPropertyCore.GetValue(o1), SortPropertyCore.GetValue(o2), SortPropertyCore.PropertyType);
              111             }
              112             if(ret == 0 && DefaultSortItem != null)
              113             {
              114                 PropertyInfo property = typeof(T).GetProperty(DefaultSortItem, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.IgnoreCase, null, null, new Type[0], null);
              115                 if(property != null)
              116                 {
              117                     ret = CompareValue(property.GetValue(o1, null), property.GetValue(o2, null), property.PropertyType);
              118                 }
              119             }
              120             if(SortDirectionCore == ListSortDirection.Descending)
              121             {
              122                 ret = -ret;
              123             }
              124 
              125             return ret;
              126         }
              127 
              128         private static int CompareValue(object o1, object o2, Type type)
              129         {
              130             if(o1 == null)
              131             {
              132                 return o2 == null ? 0 : -1;
              133             }
              134             else if(o2 == null)
              135             {
              136                 return 1;
              137             }
              138             else if(type == typeof(char))
              139             {
              140                 return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
              141             }
              142             else if (type.IsEnum ||type.IsPrimitive)
              143             {
              144                 return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));
              145             }
              146             else if(type == typeof(DateTime))
              147             {
              148                 return Convert.ToDateTime(o1).CompareTo(o2);
              149             }
              150             else
              151             {
              152                 return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
              153             }
              154         }
              155     }
              156 }
              复制代码
              相关文章
              相关标签/搜索
              香港蓝月亮精选免费资料大全管家婆王中王鉄算盘开奖结果2019开奖记录结果查询香港马会开奖结果历史纪录在线查询 台南市| 会昌县| 德格县| 永春县| 吕梁市| 桓台县| 桓仁| 双桥区| 南宫市| 长宁区| 井研县| 葫芦岛市| 台东市| 绥滨县| 白河县| 龙门县| 宁安市| 遂川县| 获嘉县| 河南省| 东安县| 南丰县| 新昌县| 太原市| 封开县| 揭阳市| 时尚| 新竹县| 大关县| 论坛| 海阳市| 兴业县| 昂仁县| 滦平县| 张家川| 汶川县| 竹北市| 凌海市| 正阳县| 万州区| 河间市| 昌乐县| 凉城县| 徐闻县| 吉首市| 砚山县| 达日县| 棋牌| 靖江市| 眉山市| 华蓥市| 南安市| 辽阳县| 潮安县| 汾西县| 顺昌县| 城口县| 两当县| 新乐市| 和政县| 磴口县| 霍城县| 金沙县| 镇赉县| 农安县| 阿图什市| 穆棱市| 龙陵县| 含山县| 盐边县| 清苑县| 化州市| 岫岩| 邢台市| 洪雅县| 芷江| 务川| 清水县| 石河子市| 古蔺县| 东乡县| 丘北县| 广丰县| 棋牌| 海南省| 合江县| 金川县| 旅游| 贺州市| 襄樊市| 阳西县| 岱山县| 米易县| 泰顺县| 白水县| 济南市| 南川市| 墨脱县| 包头市| 乌拉特中旗| 昌都县| 张掖市| 康马县| 河南省| 永吉县| 怀来县| 永胜县| 河间市| 洛宁县| 楚雄市| 白水县| 大同市| 平陆县| 嘉鱼县| 德兴市| 宁化县| 隆尧县| 射洪县| 房山区| 灌阳县| 府谷县| 紫金县| 米泉市| 太原市| 庄浪县| 武邑县| 当阳市| 仁寿县| 稷山县| 唐海县| 黔西| 西乌珠穆沁旗| 北安市| 那曲县| 上高县| 特克斯县| 专栏| 阜康市| 阿荣旗| 定陶县| 信宜市| 自治县| 图木舒克市| 含山县| 黑山县| 庆阳市| 洛阳市| 民勤县| 金堂县| 淮滨县| 汉沽区| 新蔡县| 磐石市| 秭归县| 高雄县| 阿拉善盟| 普洱| 虹口区| 广平县| 兴山县| 娱乐| 中超| 英超| 申扎县| 娱乐| 行唐县| 扶余县| 建始县| 天峨县| 宁乡县| 营山县| 沙坪坝区| 巴塘县| 汕尾市| 高淳县| 上林县| 行唐县| 宁远县| 汽车| 新和县| 金昌市| 顺昌县| 吉林市| 望江县| 文昌市| 盐亭县| 赤水市| 鹤峰县| 绥棱县| 高密市| 德阳市| 海伦市| 保定市| 察雅县| 枣阳市| 苗栗市| 土默特左旗| 应城市| 舞钢市| 河南省| 虞城县| 石首市| 大竹县| 西林县| 分宜县| 屯门区| 桃江县| 射阳县| 修武县| 通州区| 淳安县| 新郑市| 罗山县| 天门市| 毕节市| 平远县| 新丰县| 石阡县| 重庆市| 新泰市| 军事| 磐安县| 同心县| 益阳市| 钟山县| 乌鲁木齐县| 临猗县| 张家港市| 安康市| 察雅县| 浏阳市| 大洼县| 稻城县| 临颍县| 都安| 漠河县| 弥勒县| 凌云县| 阿克苏市| 调兵山市| 竹溪县| 丹棱县| 湟源县| 来安县| 商丘市| 桦南县| 寻乌县| 太康县| 望奎县| 锦屏县| 绥棱县| 乐山市| 佳木斯市| 新化县| 旬阳县| 衡水市| 宁乡县| 宜州市| 澄城县| 贡觉县| 洪泽县| 满洲里市| 拉萨市| 浦江县| 喀喇沁旗| 泰和县| 都兰县| 长葛市| 南江县| 逊克县| 五大连池市| 中宁县| 哈密市| 泽库县| 泸定县| 万盛区| 河南省| 四平市| 三都| 清苑县| 吉木乃县| 桃源县| 高平市| 娄底市| 白朗县| 正镶白旗| 垣曲县| 崇明县| 紫金县| 弥渡县| 宜宾县| 永安市| 太仆寺旗| 乌鲁木齐县| 嘉义市| 晴隆县| 兖州市| 灯塔市| 云阳县| 巨鹿县| 许昌市| 扶绥县| 嵩明县| 新竹市| 买车| 长沙县| 天等县| 太和县| 旬阳县| 甘洛县| 内黄县| 南投市| 衡东县| 二手房| 莆田市| 南城县| 安仁县| 鄄城县| 类乌齐县| 新营市| 三江| 洛南县| 怀集县| 玉山县| 宁蒗| 多伦县| 通许县| 左贡县| 蒲城县| 丹东市| 云阳县| 丰镇市| 鄂州市| 贡嘎县| 漠河县| 天台县| 大田县| 阿克| 九江县| 兴化市| 牙克石市| 新泰市| 凉城县| 成武县| 邮箱| 南投县| 五台县| 龙山县| 峨边| 盐亭县| 新昌县| 台南县| 九龙城区| 和平县| 高邑县| 安化县| 河曲县| 若羌县| 桓仁| 大名县| 池州市| 达州市| 和静县| 蛟河市| 衢州市| 静乐县| 瓦房店市| 葵青区| 灵武市| 永顺县| 信丰县| 乌兰县| 陆河县| 准格尔旗| 瑞金市| 大方县| 太谷县| 广安市| 夏河县| 海兴县| 霍林郭勒市| 信宜市| 隆昌县| 平顶山市| 崇仁县| 轮台县| 兴安县| 高平市| 永顺县| 泽库县| 淮北市| 榆林市| 丹东市| 黔南| 和政县| 康马县| 盐池县| 渭源县| 孝昌县| 获嘉县| 滦平县| 江孜县| 孝感市| 金乡县| 贵德县| 恩施市| 满城县| 凌海市| 东阿县| 巴楚县| 商洛市| 博野县| 逊克县| 东宁县| 昌黎县| 石景山区| 景洪市| 兴山县| 广州市| 浪卡子县| 荣成市| 博客| 无极县| 涞水县| 新巴尔虎右旗| 清远市| 新津县| 广汉市| 新野县| 临安市| 霍城县| 桃江县| 邮箱| 肇东市| 蒲江县| 汉阴县| 扎鲁特旗| 海伦市| 福州市| 商城县| 天门市| 罗田县| 盖州市| 碌曲县| 保德县| 永胜县| 麻江县| 缙云县| 阜平县| 湘西| 绍兴市| 循化| 井陉县| 克什克腾旗| 黑龙江省| 延津县| 安龙县| 金沙县| 莲花县| 肃北| 钦州市| 进贤县| 班玛县| 社旗县| 剑河县| 蒙自县| 武功县| 定日县| 林芝县| 通江县| 扶绥县| 儋州市| 扶风县| 皋兰县| 梓潼县| 大田县| 观塘区| 海南省| 泗洪县| 基隆市| 池州市| 天等县| 乌苏市| 寿宁县| 巫溪县| 瓮安县| 平利县| 和顺县| 陕西省| 景宁| 宜昌市| 湖南省| 彭泽县| 麻阳| 金寨县| 麻江县| 铁岭县| 沁阳市| 泾阳县| 连云港市| 清远市| 萨迦县| 平罗县| 神池县| 牙克石市| 阿拉善左旗| 慈溪市| 邢台县| 陕西省| 广丰县| 方山县| 外汇| 龙门县| 比如县| 丹东市| 阳春市| 金昌市| 齐河县| 渑池县| 侯马市| 临邑县| 通山县| 柳州市| 息烽县| 沈阳市| 巩留县| 平和县| 察隅县| 怀宁县| 江达县| 将乐县| 墨竹工卡县| 德钦县| 香河县| 绩溪县| 板桥市| 防城港市| 阳西县| 陆丰市| 乳山市| 武安市| 阿拉善盟| 遵化市| 腾冲县| 六安市| 嵊州市| 平乡县| 甘南县| 崇左市| 平利县| 长垣县| 武定县| 侯马市| 呼和浩特市| 兴宁市| 定日县| 陕西省| 张掖市| 舞阳县| 建湖县| 莎车县| 望都县| 措勤县| 湘乡市| 佳木斯市| 类乌齐县| 嵊州市| 京山县| 都江堰市| 博客| 清水河县| 普洱| 克什克腾旗| 平乡县| 南开区| 东乡| 六盘水市| 洱源县| 姜堰市| 临漳县| 平江县| 汉沽区| 多伦县| 南平市| 荣昌县| 永靖县| 抚顺市| 鹤峰县| 华容县| 廉江市| 仁化县| 米易县| 肃南| 沂南县| 苍山县| 嘉善县| 辽阳市| 达日县| 许昌县| 和静县| 奉化市| 中阳县| 新兴县| 镶黄旗| 临城县| 龙江县| 旌德县| 莱州市| 安溪县| 霍山县| 鸡西市| 香河县| 富民县| 高淳县| 高邑县| http://m.jx1870finishv.fun http://wap.jx1870fillv.fun http://hz0j1r3vo.fun http://www.jx1870getv.fun http://www.hz0j0r3vo.fun http://m.jx1870exceptv.fun http://www.jx1870launchv.fun http://jx1870explainv.fun http://wap.jx1870gardenv.fun http://www.jx1870layerv.fun http://jx1870inkv.fun http://www.jx1870laborv.fun http://m.jx1870figurev.fun http://wap.jx1870gearv.fun http://wap.jx1870landscapev.fun http://www.jx1870facev.fun http://www.jx1870heatv.fun http://jx1870exactv.fun