【问题标题】:How to get sorted itemssource from a datagrid如何从数据网格中获取已排序的项目源
【发布时间】:2011-11-12 02:29:48
【问题描述】:

我有一个包含多列的网格,用户可以根据任何列进行排序。绑定网格的数据是自定义实体的集合。我在屏幕上有一个打印按钮,单击此按钮我需要进行自定义打印。打印必须以与网格中显示的顺序相同的顺序显示数据(带有附加数据)

有没有办法直接获取排序后的数据源,而不是在排序事件中对数据源进行排序?

谢谢 潘卡伊

【问题讨论】:

    标签: wpf sorting datagrid


    【解决方案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
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 2019-09-02
        相关资源
        最近更新 更多