珂珂的个人博客 - 一个程序猿的个人网站

WPF DataGrid 服务端排序

   以前做了一个数据客户端,不过是直接连数据库的,现在认为这种方式不太好,于是改成服务端RESTful API+客户端,数据处理都在服务端。在编写过程中遇到一些问题,因为之前没有采用分页,所以排序就用DataGrid默认的就行,但是现在需要在服务端分页了,就发现了一些问题,记录下来。

  在XAML中有一个名为dataGrid1的DataGrid,点击列头排序只需要在上面加上Sorting属性

<DataGrid  Grid.Row="2" x:Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="True"  AlternationCount="2" Sorting="dataGrid1_Sorting"  >

初始化的时候可以为某一列指定排序

 ICollectionView view = CollectionViewSource.GetDefaultView(list);
 view.SortDescriptions.Clear();  //先清除所有的排序
 SortDescription sd = new SortDescription("列名",  ListSortDirection.Descending);
 view.SortDescriptions.Add(sd);

也可以在XAML中指定,假设列名是movieName

<DataGrid.Columns>

  <DataGridTextColumn Binding="{Binding Path=movieName}"     SortDirection="Ascending" SortMemberPath="movieName"  Header="名称"   />

</DataGrid.Columns>


下面来看主要排序方法

     private void dataGrid1_Sorting(object sender, DataGridSortingEventArgs e)
        {
            e.Handled = true;    //可要可不要  没去仔细研究
            pager.OrderColumn = e.Column.SortMemberPath;
            ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);

            pager.Order = "asc";  //默认升序
            if (view.SortDescriptions.Count>0)
            {
                if(view.SortDescriptions[0].PropertyName== e.Column.SortMemberPath)
                {
                    if (view.SortDescriptions[0].Direction == System.ComponentModel.ListSortDirection.Ascending)
                    {
                        pager.Order = "desc";
                    }
                    else if (view.SortDescriptions[0].Direction == ListSortDirection.Descending)
                    {
                        pager.Order = "asc";
                    }
                }
            }

            LoadData();
        }

e.Column.SortMemberPath 为点击列头的列名,问题就在e.Column.SortDirection 这个属性,如果初始化的时候有指定那么第一次点击的时候能获取到,但是再点击这个属性就是null了,没有指定也是null,好了,我在这里为它赋值e.Column.SortDirection=ListSortDirection.Descending    但是下次点击的时候它还是为null 不知为何,网上没有查到。经过好久摸索,用另一个方法来

ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);

可以从view.SortDescriptions 中取得有排序的列,判断它集合大于0并且列名是当前点击的列,如果当前是升序则变为降序同时查询降序的数据,当然最后还得执行清除排序再添加排序

view.SortDescriptions.Clear();  //先清除所有的排序
 SortDescription sd = new SortDescription("列名",  ListSortDirection.Descending);
 view.SortDescriptions.Add(sd);

这样就实现了服务端排序,不知有无更简单的方法。


上一篇:个人代码全部开源

下一篇:WPF DataGrid 服务端排序


0 评论

查看所有评论

给个评论吧