如何从数据网格中获取已排序的项目源
Posted
技术标签:
【中文标题】如何从数据网格中获取已排序的项目源【英文标题】:How to get sorted itemssource from a datagrid 【发布时间】:2011-11-12 02:29:48 【问题描述】:我有一个包含多列的网格,用户可以根据任何列进行排序。绑定网格的数据是自定义实体的集合。我在屏幕上有一个打印按钮,单击此按钮我需要进行自定义打印。打印必须以与网格中显示的顺序相同的顺序显示数据(带有附加数据)
有没有办法直接获取排序后的数据源,而不是在排序事件中对数据源进行排序?
谢谢 潘卡伊
【问题讨论】:
【参考方案1】:您必须使用 yourDataGrid.Items,Items 反映了网格的当前视图。 并且您必须使用 Cast 方法进行转换,然后使用 .ToList();
想象一下
List<MyClass> myListOfMyClass = new List<MyClass>();
myGrid.ItemSource = myListOfMyClass;
List<MyClass> myListOfMyClassSortedByTheUser = myGrid.Items.Cast<MyClass>().ToList();
【讨论】:
【参考方案2】:是的,有。在 WPF 中,总是绑定 CollectionView
,而不是集合本身。如果您自己不指定集合视图,则使用默认视图。您可以像这样访问此默认集合视图:
CollectionViewSource.GetDefaultView(yourCollectionOfCustomEntities);
这是应用了所有排序和过滤的网格显示的集合视图。
【讨论】:
根据您的回答,我的理解是源集合永远不会改变,只有 CollectionView 会改变(当用户对任何列中的数据进行排序时)。为了让我的打印工作,我需要收集表单(List(of Entities))中的数据。所以默认的集合视图是不够的。有没有一种简单的方法可以根据排序的 collectionView 对集合进行排序?我在调试时观察到的一件事是 CollectionView 有一个受保护的属性 InternalList,它具有已排序的集合。但由于财产受到保护,我无法得到它。 在枚举集合视图时,项目应该按排序顺序返回...请检查 是的,我能够枚举集合视图并构建排序集合。 @PankajVohra 下面的 Felipe 给出了正确答案......只需使用 DataGrid 的 Items 属性。【参考方案3】:您也可以只枚举 DataGrid 的 Items 属性。与 ItemsSource 属性不同,Items 属性似乎准确地反映了屏幕上的内容,包括排序和过滤。例如:
foreach (var item in dataGrid.Items)
// do something
【讨论】:
以上是关于如何从数据网格中获取已排序的项目源的主要内容,如果未能解决你的问题,请参考以下文章
如何获取flex中是否修改了AdvancedDatagrid数据?
Telerik获取所选ID(从Radgrid选择项目中获取数据)