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

  • 相关阅读:
    怎样创建动态扩容数组?
    怎样终止一个线程?
    模式识别
    基于Linux根据僵尸网络病毒平台《比尔盖茨》
    web.xml在&lt;init-param&gt;一个错误
    DTD学习笔记
    Java排序算法(四):Shell排序
    VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
    Maven 建 Struts2 基本实现 CURD Controller
    Andy&#39;s First Dictionary
  • 原文地址:https://www.cnblogs.com/imap/p/2816314.html
Copyright © 2011-2022 走看看