zoukankan      html  css  js  c++  java
  • NET可绑定可排序列表

    /// <summary>
    	/// BindingList with sorting feature
    	/// </summary>
    	/// <typeparam name="T"></typeparam>
    	public class SortableBindingList<T> : BindingList<T>
    	{
    		private bool isSortedCore = true;
    		private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
    		private PropertyDescriptor sortPropertyCore = null;
    		private string defaultSortItem;
    
    		/// <summary>
    		/// constructor
    		/// </summary>
    		public SortableBindingList() : base() { }
    
    		/// <summary>
    		/// constructor
    		/// </summary>
    		/// <param name="list"></param>
    		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();
    			}
    		}
    
    		/// <summary>
    		/// Default sort field
    		/// </summary>
    		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;
    			if (o2 == null)
    				return 1;
    			if (type.IsPrimitive || type.IsEnum || IsNullablePrimitiveType(type))
    				return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));
    			if (type == typeof (DateTime) || type == typeof (DateTime?))
    				return Convert.ToDateTime(o1).CompareTo(o2);
    			return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
    		}
    
    		/// <summary>  
    		/// 判断是否为基元类型可空类型  
    		/// </summary>  
    		/// <param name="type">类型</param>  
    		/// <returns>是否</returns>  
    		public static bool IsNullablePrimitiveType(Type type)
    		{
    			if (!type.IsGenericType)
    			{
    				return false;
    			}
    			//泛型的基础类型是否是基元类型
    			if (!type.GetGenericArguments()[0].IsPrimitive)
    			{
    				return false;
    			}
    
    			Type genericTypeDefinition = type.GetGenericTypeDefinition();
    			return genericTypeDefinition != null && genericTypeDefinition.Equals(typeof (Nullable<>));
    		}
    	}
    

      用法:

    dgvDetail.DataSource=  new SortableBindingList<Person>(listPerson);

  • 相关阅读:
    创建百度地图实例
    IntelliJ IDEA使用(1)——IDEA配置JDK
    IntelliJ IDEA使用(2)——IDEA配置Tomcat
    怎样使用 GitHub?
    IntelliJ IDEA使用(3)——IDEA连接Git
    AS3.0杂记——Dictionary、Object与Array
    AIR文件操作:使用文件对象操作文件和目录 .
    As3.0 TextField
    关于乘机
    Html 嵌入 swf
  • 原文地址:https://www.cnblogs.com/imap/p/2816314.html
Copyright © 2011-2022 走看看