自定義擴展類:ide
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Wu_Li.Entity { public class ObjectPropertyCompare<T> : IComparer<T> { private PropertyDescriptor property; private ListSortDirection direction; // 構造函數 public ObjectPropertyCompare(PropertyDescriptor property, ListSortDirection direction) { this.property = property; this.direction = direction; } // 實現IComparer中方法 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 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; } } } /// <summary> /// 自定義綁定列表類 /// </summary> /// <typeparam name="T">列表對象類型</typeparam> public class BindingCollection<T> : BindingList<T> { private bool isSorted; private PropertyDescriptor sortProperty; private ListSortDirection sortDirection; /// <summary> /// 構造函數 /// </summary> public BindingCollection() : base() { } /// <summary> /// 構造函數 /// </summary> /// <param name="list">IList類型的列表對象</param> public BindingCollection(IList<T> list) : base(list) { } /// <summary> /// 自定義排序操做 /// </summary> /// <param name="property"></param> /// <param name="direction"></param> protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) { List<T> items = this.Items as List<T>; if (items != null) { ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(property, direction); items.Sort(pc); isSorted = true; } else { isSorted = false; } sortProperty = property; sortDirection = direction; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } /// <summary> /// 獲取一個值,指示列表是否已排序 /// </summary> protected override bool IsSortedCore { get { return isSorted; } } /// <summary> /// 獲取一個值,指示列表是否支持排序 /// </summary> protected override bool SupportsSortingCore { get { return true; } } /// <summary> /// 獲取一個只,指定類別排序方向 /// </summary> protected override ListSortDirection SortDirectionCore { get { return sortDirection; } } /// <summary> /// 獲取排序屬性說明符 /// </summary> protected override PropertyDescriptor SortPropertyCore { get { return sortProperty; } } /// <summary> /// 移除默認實現的排序 /// </summary> protected override void RemoveSortCore() { isSorted = false; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } public static implicit operator BindingCollection<T>(List<VM> v) { throw new NotImplementedException(); } } }
綁定:函數
BindingCollection<VM> vms = new BindingCollection<VM>(); foreach (VM item in list) { vms.Add(item); } dataGridView1.DataSource = vms;