安德鲁·戴维斯创建了一个优秀的小类SourceForge上称为BindingListView<T>基本上可以让你收集绑定到DataGridView支持排序和过滤一段时间.DataGridView将a 绑定到法线List<T>不支持排序和过滤,因为没有实现正确的接口List<T>.
该课程运行良好,解决了我的UI问题.但是,如果我可以使用LINQ遍历集合,那将是非常棒的,但我只是不确定如何设置它.源代码可以在这里下载.谁能帮我吗?
由于该BindingListView<T>项目使用.NET Framework v2.0并且早于LINQ,因此它不会公开IEnumerable<T>您要查询的内容.由于它确实实现了非泛型IEnumerable和非泛型IList,因此您可以使用Enumerable.Cast<TResult>将集合转换为适合与LINQ一起使用的形式.然而,由于这种方法是不是有帮助IEnumerable的是AggregateBindingListView<T>返回与类型的内部数据结构KeyValuePair<ListItemPair<T>, int>.
要升级这个项目与LINQ使用方便,最简单的方法可能是实现IEnumerable<T>上AggregateBindingListView<T>.首先将它添加到类的声明中:
public class AggregateBindingListView<T> : Component, IBindingListView, IList, IRaiseItemChangedEvents, ICancelAddNew, ITypedList, IEnumerable<T>
Run Code Online (Sandbox Code Playgroud)
然后在类定义的末尾实现它:
#region IEnumerable<T> Members
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
for (int i = 0; i < _sourceIndices.Count; i++)
yield return _sourceIndices[i].Key.Item.Object;
}
#endregion
Run Code Online (Sandbox Code Playgroud)
现在你可以在这样的BindingListView<T>实例上直接使用LINQ :
// Create a view of the items
itemsView = new BindingListView<Item>(feed.Items);
var descriptions = itemsView.Select(t => t.Description);
Run Code Online (Sandbox Code Playgroud)
请记住将所有项目从.NET Framework v2.0升级到.NET Framework 4 Client Profile并添加using System.Linq;,以使其与当前项目一起使用.
| 归档时间: |
|
| 查看次数: |
3457 次 |
| 最近记录: |