Winform DataGridView扩展

public class ObjectPropertyCompare<T> : IComparer<T>
{
    private readonly PropertyDescriptor property;
    private readonly ListSortDirection direction;

    public ObjectPropertyCompare(PropertyDescriptor property, ListSortDirection direction)
    {
        this.property = property;
        this.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 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;
        }
        return returnValue * -1;
    }
}
public class BindingCollection<T> : BindingList<T>
{
    private bool isSorted;
    private PropertyDescriptor sortProperty;
    private ListSortDirection sortDirection;

    public BindingCollection()
    {
    }

    public BindingCollection(IList<T> list)
        : base(list)
    {
    }

    protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
    {
        var items = Items as List<T>;

        if (items != null)
        {
            var pc = new ObjectPropertyCompare<T>(property, direction);
            try
            {
                items.Sort(pc);
                isSorted = true;
            }
            catch (Exception)
            {
                isSorted = false;
            }
        }
        else
        {
            isSorted = false;
        }

        sortProperty = property;
        sortDirection = direction;

        OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
    }

    protected override bool IsSortedCore
    {
        get { return isSorted; }
    }

    protected override bool SupportsSortingCore
    {
        get { return true; }
    }

    protected override ListSortDirection SortDirectionCore
    {
        get { return sortDirection; }
    }

    protected override PropertyDescriptor SortPropertyCore
    {
        get { return sortProperty; }
    }

    protected override void RemoveSortCore()
    {
        isSorted = false;
        OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
    }
}
原文地址:https://www.cnblogs.com/yao2yao4/p/3179134.html