如何从数据网格中获取已排序的项目源

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选择项目中获取数据)

如何在可缩放滚动视图中绘制可点击的网格对象,从远程 json 数据中获取数据?

如何在 WPF 数据网格中显示 N 个项目?