DataGridView绑定BindingList<T>带数据排序的类
本文章转载:http://yuyingying1986.blog.hexun.com/30905610_d.html
DataGridView绑定List<T>类时候,不会自动的进行排序。默认BinddingList<T> 不支持排序。
解决办法:一、手动实现DataGridView列标题的点击排序事件。二、自定义实现BinddingList<T>类 支持排序。
我们常常使用DataGridView 控件,这个控件在绑定数据源后,常常不能排序,正好我现在做的项目中也遇上了这个问题,所以上网查了一些资料,解决了这个问题,下面是我解决的方法 1.创健一个专门用来排序的类 处理手段 做排序处理,做本质的办法是继承ICompare接口,重新Compare方法。 代码: using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel; namespace ConcreteMonitor.VehicleManagement
{
class ObjectPropertyCompare<T> : System.Collections.Generic.IComparer<T>
{ private PropertyDescriptor _property;
public PropertyDescriptor property
{
get { return _property; }
set { _property = value; }
} private ListSortDirection _direction;
public ListSortDirection direction
{
get { return _direction; }
set { _direction = value; }
} public ObjectPropertyCompare()
{ } public ObjectPropertyCompare(PropertyDescriptor prop, ListSortDirection direction)
{
_property = prop;
_direction = direction;
} public int Compare(T x, T y)
{ object xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
object yValue = y.GetType().GetProperty(property.Name).GetValue(y, null); int returnValue; if (xValue == null && yValue == null)
{
returnValue = 0;
}
else if (xValue == null)
{
returnValue = -1;
}
else if (yValue == null)
{
returnValue = 1;
}
else if (xValue is IComparable)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
else if (xValue.Equals(yValue))
{
returnValue = 0;
}
else
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
} if (direction == ListSortDirection.Ascending)
{
return returnValue;
}
else
{
return returnValue * -1;
} }
}
} 2.创建用于绑定数据源的类 using System.Text;
using System.ComponentModel;
using JtxSignal;
using JtxSignal.Signals;
using ConcreteMonitor.Database;
using System.Data;
using System.Collections;
using ConcreteMonitor.Properties; namespace ConcreteMonitor.VehicleManagement
{
public class BindingCollection<T> : BindingList<T>
{
protected override bool SupportsSortingCore
{
get { return true; }
} protected override bool SupportsSearchingCore
{
get { return true; }
} private bool isSortedCore = true;
protected override bool IsSortedCore
{
get
{
return isSortedCore;
}
} private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
protected override ListSortDirection SortDirectionCore
{
get
{
return sortDirectionCore;
}
} private PropertyDescriptor sortPropertyCore = null;
protected override PropertyDescriptor SortPropertyCore
{
get
{
return sortPropertyCore;
}
} protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> items = this.Items as List<T>; if (items != null)
{
ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(prop, direction);
items.Sort(pc);
isSortedCore = true;
sortDirectionCore = direction;
sortPropertyCore = prop;
}
else
{
isSortedCore = false;
} this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
} protected override void RemoveSortCore()
{
isSortedCore = false;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
} 3.使用
List<T> list=new List<T>();
DataGridView.DataSource = new BindingCollection<自己定义的类>(list); 4.完成
第二种写法:
public class SortableBindingList<T> : BindingList<T>
{
private readonly Dictionary<Type, PropertyComparer<T>> comparers;
private bool isSorted;
private ListSortDirection listSortDirection;
private PropertyDescriptor propertyDescriptor; public SortableBindingList()
: base(new List<T>())
{
this.comparers = new Dictionary<Type, PropertyComparer<T>>();
} public SortableBindingList(IEnumerable<T> enumeration)
: base(new List<T>(enumeration))
{
this.comparers = new Dictionary<Type, PropertyComparer<T>>();
} protected override bool SupportsSortingCore
{
get { return true; }
} protected override bool IsSortedCore
{
get { return this.isSorted; }
} protected override PropertyDescriptor SortPropertyCore
{
get { return this.propertyDescriptor; }
} protected override ListSortDirection SortDirectionCore
{
get { return this.listSortDirection; }
} protected override bool SupportsSearchingCore
{
get { return true; }
} protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
List<T> itemsList = (List<T>)this.Items; Type propertyType = property.PropertyType;
PropertyComparer<T> comparer;
if (!this.comparers.TryGetValue(propertyType, out comparer))
{
comparer = new PropertyComparer<T>(property, direction);
this.comparers.Add(propertyType, comparer);
} comparer.SetPropertyAndDirection(property, direction);
itemsList.Sort(comparer); this.propertyDescriptor = property;
this.listSortDirection = direction;
this.isSorted = true; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
} protected override void RemoveSortCore()
{
this.isSorted = false;
this.propertyDescriptor = base.SortPropertyCore;
this.listSortDirection = base.SortDirectionCore; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
} protected override int FindCore(PropertyDescriptor property, object key)
{
int count = this.Count;
for (int i = 0; i < count; ++i)
{
T element = this[i];
if (property.GetValue(element).Equals(key))
{
return i;
}
} return -1;
}
} public class PropertyComparer<T> : IComparer<T>
{
private readonly IComparer comparer;
private PropertyDescriptor propertyDescriptor;
private int reverse; public PropertyComparer(PropertyDescriptor property, ListSortDirection direction)
{
this.propertyDescriptor = property;
Type comparerForPropertyType = typeof(Comparer<>).MakeGenericType(property.PropertyType);
this.comparer = (IComparer)comparerForPropertyType.InvokeMember("Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null);
this.SetListSortDirection(direction);
} #region IComparer<T> Members public int Compare(T x, T y)
{
return this.reverse * this.comparer.Compare(this.propertyDescriptor.GetValue(x), this.propertyDescriptor.GetValue(y));
} #endregion private void SetPropertyDescriptor(PropertyDescriptor descriptor)
{
this.propertyDescriptor = descriptor;
} private void SetListSortDirection(ListSortDirection direction)
{
this.reverse = direction == ListSortDirection.Ascending ? 1 : -1;
} public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction)
{
this.SetPropertyDescriptor(descriptor);
this.SetListSortDirection(direction);
}
} 调用: List<Model.EmailList> emails = (List<Model.EmailList>)e.Data;
dgvEmails.DataSource =new SortableBindingList<Model.EmailList>(emails);
DataGridView绑定BindingList<T>带数据排序的类的更多相关文章
- C# 中 datagridview 绑定BindingList类型和更新
C# 中的datagridview是一个非常有用且强大的控件,可以用来绑定数据库.绑定LIST类型的变量等等. 这里我们说一说绑定List类型并实时更新datagridview的情况.实时更新,指的是 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- DataGridView绑定数据、删除数据
定义学生类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- winform datagridview 绑定泛型集合变得不支持排序的解决方案
原文:winform datagridview 绑定泛型集合变得不支持排序的解决方案 案例: 环境:Winform程序 控件:Datagridview 现象:Datagridview控件绑定到List ...
- DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样
'近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...
- c# winform 中DataGridView绑定List<T> 不能显示数据
遇到问题 DataGridView绑定List后,List更新后再次绑定不显示数据 datagridview 绑定数据源的时候 用List是不能显示修改内容的..要用binginglist<T& ...
- DataGridView绑定泛型List时,利用BindingList来实现增删查改
DataGridView绑定泛型List时,利用BindingList来实现增删查改 一. DataGridView绑定泛型List的种种 1.DataGridView数据绑定对比(DataTa ...
- DataGridView 绑定数据方法
DataGridView控件用于显示来自多种外部数据源中的数据,用户可以在此控件添加行和列,并可以填充数据. 如要让DataGridView显示数据库中的数据,只需要将此控件绑定到挑用数据库的数据 ...
- DataGridView绑定数据源的几种方式
使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据. 将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可.在绑 ...
随机推荐
- JDK常用类_util
集合 Collection:集合顶层接口 AbstractCollection:集合抽象类 关联数组 Map:顶层接口 AbstractMap:抽象类实现,提供了子类的通用操作 HashMap:哈希表 ...
- 线程取消 (pthread_cancel)
线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(C ...
- scons小结
scons是用python写的,据说是比make要方便很多,其实我都没写过makeFile...... 1.安装 方式1:下载安装包安装,需要用python setup.py install去编译 方 ...
- PHP框架_Smarty
目录 1.环境搭建 2.基本配置 3.Smarty变量调节器 4.Smarty条件判断 5.Smarty的循环 6.Smarty模板的引用 7.Smarty类与对象的赋值与引用 8.smarty函数插 ...
- To Build A Dev Env On Linux(Ubuntu)
Step1:System Installing 1)use iso image to Step2:Configuration Step3:Software Installing Step4:Other ...
- 用汇编语言研究C语言的全局变量、局部变量、参数、返回值放在哪里
前提知识 c0s调用main函数的地址: 11ah main函数的连接地址: 01fah 一.全局变量与局部变量 测试程序 int a1,a2,a3; void f(void); void g(voi ...
- BAT等互联网公司薪资分享
- IOS中用模型取代字典的好处
使用字典的坏处 一般情况下,设置数据和取出数据都是用“字符串类型的key”,编写这些key时,编译器不会有任何友情提示,需要手敲 dict[@“name”]=@“Kevin”; NSString *n ...
- "Redis客户端连接数一直降不下来"的有关问题解决
[线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...
- Eclipse ARM IDE 开发环境
一.Eclipse Eclipse的本身只是一个框架平台,但是众多插件的支持,使得Eclipse拥有较好的灵活性. 二.CDT CDT是Eclipse用于扩展Eclipse支持C/C++开发的插件. ...