C#中DataGridView使用非泛型或者未实现IBindingList接口泛型集合的列排序问题  

都说标题长了才有霸气,咱这个标题够霸气了吧.读的我自己都晕乎乎的.今天遇到一个电脑操作问题,没找到合适的软件就自己写了一个.结果遇到了标题中出现的问题.DataGridView中的数据说什么就是排序不了,折腾了好一顿才发现是IBindingList接口问题.出个方案放在这吧,阿门.

/// <summary>
/// 可排序绑定用泛型列表,还是叫起来别扭...
/// Author:Clove
/// Site:http://30c.org
/// </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;

public SortableBindingList() : base() { }

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

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;
    else if (o2 == null) return 1;
    else if (type.IsPrimitive || type.IsEnum) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));
    else if (type == typeof(DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);
    else return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
}
}

在需要的地方直接new一个就OK了.

private SortableBindingList<MyProcess> myProcessList = new SortableBindingList<MyProcess>();

请订阅本站 RSS feed 订阅到信箱 ,欢迎 Donate 或者 上面的广告内容 支持三十岁

本文链接:C#中DataGridView使用非泛型或者未实现IBindingList接口泛型集合的列排序问题

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:三十岁,谢谢!^^


分享到:          
评论关闭