如何排序BindingList

本文关键字:BindingList 排序 何排序 | 更新日期: 2023-09-27 18:08:50

我在BindingList<MyClass>中存储了数千个MyClass对象。我想按日期属性MyClass.dt对它们进行排序。

类BindingList不支持直接排序。我如何排序BindingList<T>不使所有对象的副本?我需要按升序或降序排序。

我不需要在BindingList.Sort()中描述的特殊类SortableBindingList来表现得像List.Sort()。我正在寻找一到两行代码的短解决方案。

如何排序BindingList<T>

Linq可以。

var sortedListInstance = new BindingList<MyClass>(unsortedListInstance.OrderBy(x => x.dt).ToList());

请记住,您得到的是排序列表的浅拷贝,而不是MyClass的重复实例。

不要忘记在代码文件的顶部包含命名空间System.Linq

在BindingList上实现Sort的一种快速方法是使用接受一个后备IList作为它的辐角。您可以使用List<T>作为支持并获得其Sort功能。

根据文档

使用这个BindingList创建一个由list支持的BindingList,以确保对list的更改反映在BindingList中。

如果你的MyClass定义为:

internal class MyClass
{
    public MyClass(string name, Int32 num)
    {
        this.Name = name;
        this.Num = num;
    }
    public string Name {get; set;}
    public Int32 Num {get; set;}
}

那么你可以这样做,在Num字段上排序。

private List<MyClass> backing;
private BindingList<MyClass> bl;
    private void InitializeBindingList()
        {
            backing = new List<MyClass>();
            bl = new BindingList<MyClass>(backing);
            bl.Add(new MyClass("a", 32));
            bl.Add(new MyClass("b", 23));
            bl.Add(new MyClass("c", 11));
            bl.Add(new MyClass("d", 34));
            bl.Add(new MyClass("e", 53));
        }
    private void SortBindingList()
        {
            backing.Sort((MyClass X, MyClass Y) => X.Num.CompareTo(Y.Num));
            // tell the bindinglist to raise a list change event so that 
            // bound controls reflect the new item order
            bl.ResetBindings();
        }
    }

需要调用BindingList。ResetBindings方法,通知任何绑定控件BindingList已更改并更新该控件。

//Convert it to a data table, then the Automatic will work.
DataGridView.DataSource = ConvertToDataTable(MyList).DefaultView;
public DataTable ConvertToDataTable(IBindingList list)
{
   DataTable dt = new DataTable();
   if (list.Count > 0)
   {
      Type typ = list[0].GetType();
      PropertyInfo[] arrProps = typ.GetProperties();
      foreach (PropertyInfo pi in arrProps)
      {
         Type colType = pi.PropertyType;
         if (colType.IsGenericType)
         {
            colType = colType.GetGenericArguments()[0];
         }
         dt.Columns.Add(pi.Name, colType);
      }
      foreach (object obj in list)
      {
         DataRow dr = dt.NewRow();
         foreach (PropertyInfo pi in arrProps)
         {
            if (pi.GetValue(obj, null) == null)
               dr[pi.Name] = DBNull.Value;
            else
               dr[pi.Name] = pi.GetValue(obj, null);
         }
         dt.Rows.Add(dr);
      }
   }
   return dt;
}
相关文章: