如何排序BindingList
本文关键字:BindingList 排序 何排序 | 更新日期: 2023-09-27 18:08:50
我在BindingList<MyClass>
中存储了数千个MyClass对象。我想按日期属性MyClass.dt
对它们进行排序。
类BindingList不支持直接排序。我如何排序BindingList<T>
不使所有对象的副本?我需要按升序或降序排序。
我不需要在BindingList.Sort()中描述的特殊类SortableBindingList
来表现得像List.Sort()。我正在寻找一到两行代码的短解决方案。
Linq可以。
var sortedListInstance = new BindingList<MyClass>(unsortedListInstance.OrderBy(x => x.dt).ToList());
请记住,您得到的是排序列表的浅拷贝,而不是MyClass
的重复实例。
不要忘记在代码文件的顶部包含命名空间System.Linq
在BindingList上实现Sort的一种快速方法是使用接受一个后备IListList<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;
}