gpt4 book ai didi

.net - DataGridView 排序和例如.NET 中的 BindingList

转载 作者:行者123 更新时间:2023-12-04 01:15:52 24 4
gpt4 key购买 nike

我正在使用 BindingList<T>在包含“IComparable<Contact>”联系人对象列表的 Windows 窗体中。现在我希望用户能够按网格中显示的任何列进行排序。

MSDN online 上描述了一种方法,它显示了如何实现基于BindingList<T> 的自定义集合。允许排序。但是,是不是有一个排序事件或可以在 DataGridView(或者更好的是,在 BindingSource 上)中捕获的东西来使用自定义代码对基础集合进行排序?

我不太喜欢 MSDN 描述的方式。另一种方法是我可以轻松地将 LINQ 查询应用于集合。

最佳答案

我非常感谢Matthias' solution因为它的简单和美丽。

然而,虽然这为低数据量提供了出色的结果,但在处理大数据量时,由于反射,性能并不是那么好。

我用一组简单的数据对象进行了测试,计算了 100000 个元素。按整数类型属性排序大约需要 1 分钟。我将进一步详细介绍的实现将其更改为~200ms。

基本思想是有利于强类型比较,同时保持 ApplySortCore 方法的通用性。下面将通用比较委托(delegate)替换为对特定比较器的调用,在派生类中实现:

SortableBindingList 中的新功能:

protected abstract Comparison<T> GetComparer(PropertyDescriptor prop);

ApplySortCore 更改为:
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> itemsList = (List<T>)this.Items;
if (prop.PropertyType.GetInterface("IComparable") != null)
{
Comparison<T> comparer = GetComparer(prop);
itemsList.Sort(comparer);
if (direction == ListSortDirection.Descending)
{
itemsList.Reverse();
}
}

isSortedValue = true;
sortPropertyValue = prop;
sortDirectionValue = direction;
}

现在,在派生类中,必须为每个可排序属性实现比较器:
class MyBindingList:SortableBindingList<DataObject>
{
protected override Comparison<DataObject> GetComparer(PropertyDescriptor prop)
{
Comparison<DataObject> comparer;
switch (prop.Name)
{
case "MyIntProperty":
comparer = new Comparison<DataObject>(delegate(DataObject x, DataObject y)
{
if (x != null)
if (y != null)
return (x.MyIntProperty.CompareTo(y.MyIntProperty));
else
return 1;
else if (y != null)
return -1;
else
return 0;
});
break;

// Implement comparers for other sortable properties here.
}
return comparer;
}
}
}

这个变体需要更多的代码,但如果性能是一个问题,我认为值得付出努力。

关于.net - DataGridView 排序和例如.NET 中的 BindingList<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/249779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com