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

    }

}

 

你可能感兴趣的:(datagridview)