转载:http://www.kecq.com/artic-10322303.html

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

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

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

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

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

  

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

<DataGrid.Columns>

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

</DataGrid.Columns>

下面来看主要排序方法

  1. private void dataGrid1_Sorting(object sender, DataGridSortingEventArgs e)
  2. {
  3. e.Handled = true; //可要可不要 没去仔细研究
  4. pager.OrderColumn = e.Column.SortMemberPath;
  5. ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
  6.  
  7. pager.Order = "asc"; //默认升序
  8. if (view.SortDescriptions.Count>)
  9. {
  10. if(view.SortDescriptions[].PropertyName== e.Column.SortMemberPath)
  11. {
  12. if (view.SortDescriptions[].Direction == System.ComponentModel.ListSortDirection.Ascending)
  13. {
  14. pager.Order = "desc";
  15. }
  16. else if (view.SortDescriptions[].Direction == ListSortDirection.Descending)
  17. {
  18. pager.Order = "asc";
  19. }
  20. }
  21. }
  22.  
  23. LoadData();
  24. }

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

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

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

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

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

补充:

文中提到:我在这里为它赋值e.Column.SortDirection=ListSortDirection.Descending,。这里实际效果重新绑定数据后会丢失以前的排序。应该在绑定数据后再重新绑定列的排序状态

所以我这里这样处理的,

1、后端记录上次的排序状态 某列名 升序还是降序

2、绑定数据后,再次赋值当前的排序状态。swich记录的当前排序也就是重新绑定数据前的排序,case某列的排序状态,然后gridResult2.Columns[2].SortDirection重新设置此列的排序状态值。这样就能在​DataGridSortingEventArgs e  ​ e.Column.SortDirection 属性中获取到重新设置的排序值。这样重新赋值,也能显示自带的排序小箭头。不明白的可以联系www.kaishanguai.com或qq369628105​

switch (CurrentOrderByEnum)
                {
                    case (OrderByEnum.OrderByNameAsc):
                        gridResult2.Columns[2].SortDirection = ListSortDirection.Ascending;
                        break;

case (OrderByEnum.OrderByNameDesc):
                        gridResult2.Columns[2].SortDirection = ListSortDirection.Descending;
                        break;

}​

 

代码:

  1. <DataGrid x:Name="gridResult2" SelectionUnit="FullRow" MinHeight="" EnableRowVirtualization ="False" GridLinesVisibility="None" BorderThickness="" AlternationCount="" ItemsSource="{Binding}" CanUserAddRows="False" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False" Visibility="Hidden" IsReadOnly="True" SelectionMode="Extended" Sorting="GridResult2_OnSorting" MouseMove="GridResult2_OnMouseMove" MouseLeftButtonDown="GridResult2_OnMouseLeftButtonDown" MouseLeftButtonUp="GridResult2_OnMouseLeftButtonUp" MouseRightButtonUp="ImageGrid_OnMouseRightButtonDown" LoadingRow="GridResult2_OnLoadingRow" KeyDown="DataView_OnKeyDown" PreviewKeyDown="GridResult2_OnPreviewKeyDown">
  2. <!--SelectionChanged="GridResult2_OnSelectionChanged" -->
  3. <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
  4. <DataGrid.CommandBindings>
  5. <CommandBinding Command="Copy" Executed="CopyCommand" />
  6. </DataGrid.CommandBindings>
  7.  
  8. <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
  9. <DataGrid.InputBindings>
  10. <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
  11. </DataGrid.InputBindings>
  12.  
  13. <DataGrid.Columns>
  14. <DataGridTemplateColumn>
  15. <DataGridTemplateColumn.HeaderTemplate>
  16. <DataTemplate>
  17. <CheckBox Name="ChkAll" ToolTip="All" Content="All" IsChecked="False" Unchecked="UnAll_Checked" Checked="All_Checked"></CheckBox>
  18. </DataTemplate>
  19. </DataGridTemplateColumn.HeaderTemplate>
  20. <DataGridTemplateColumn.CellTemplate>
  21. <DataTemplate>
  22. <CheckBox Checked="ItemFile_OnChecked" Unchecked="ItemFile_OnUnchecked" Tag="{Binding FilePath}" HorizontalAlignment="Center" x:Name="itemFile" VerticalAlignment="Center" />
  23. </DataTemplate>
  24. </DataGridTemplateColumn.CellTemplate>
  25. </DataGridTemplateColumn>
  26.  
  27. <DataGridTemplateColumn Header="">
  28. <DataGridTemplateColumn.CellTemplate>
  29. <DataTemplate>
  30. <Image Source="{Binding SnapshotPath}" Height="" Width="" />
  31. </DataTemplate>
  32. </DataGridTemplateColumn.CellTemplate>
  33. </DataGridTemplateColumn>
  34.  
  35. <DataGridTextColumn Header="Name" Binding="{Binding FileName}" />
  36. <DataGridTemplateColumn Header="MD5">
  37. <DataGridTemplateColumn.HeaderStyle>
  38. <Style TargetType="DataGridColumnHeader">
  39. <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
  40. </Style>
  41. </DataGridTemplateColumn.HeaderStyle>
  42. <DataGridTemplateColumn.CellTemplate>
  43. <DataTemplate>
  44. <TextBlock HorizontalAlignment="Center" Text="{Binding FileMD5}"></TextBlock>
  45. </DataTemplate>
  46. </DataGridTemplateColumn.CellTemplate>
  47. </DataGridTemplateColumn>
  48.  
  49. <DataGridTemplateColumn Header="Modified Date" CanUserSort="True" SortMemberPath="FileModifiedTime">
  50. <DataGridTemplateColumn.HeaderStyle>
  51. <Style TargetType="DataGridColumnHeader">
  52. <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
  53. </Style>
  54. </DataGridTemplateColumn.HeaderStyle>
  55. <DataGridTemplateColumn.CellTemplate>
  56. <DataTemplate>
  57. <TextBlock HorizontalAlignment="Center" Text="{Binding FileModifiedTime}"></TextBlock>
  58. </DataTemplate>
  59. </DataGridTemplateColumn.CellTemplate>
  60. </DataGridTemplateColumn>
  61.  
  62. <DataGridTextColumn Header="Path" Binding="{Binding FilePathNoName}" />
  63.  
  64. <DataGridTemplateColumn Header="Classify Type" CanUserSort="True" SortMemberPath="ClassifyType">
  65. <DataGridTemplateColumn.HeaderStyle>
  66. <Style TargetType="DataGridColumnHeader">
  67. <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
  68. </Style>
  69. </DataGridTemplateColumn.HeaderStyle>
  70. <DataGridTemplateColumn.CellTemplate>
  71. <DataTemplate>
  72. <TextBlock HorizontalAlignment="Center" Text="{Binding ClassifyType}"></TextBlock>
  73. </DataTemplate>
  74. </DataGridTemplateColumn.CellTemplate>
  75. </DataGridTemplateColumn>
  76.  
  77. <DataGridTemplateColumn Header="Type">
  78. <DataGridTemplateColumn.HeaderStyle>
  79. <Style TargetType="DataGridColumnHeader">
  80. <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
  81. </Style>
  82. </DataGridTemplateColumn.HeaderStyle>
  83. <DataGridTemplateColumn.CellTemplate>
  84. <DataTemplate>
  85. <TextBlock HorizontalAlignment="Center" Text="{Binding FileExtension}"></TextBlock>
  86. </DataTemplate>
  87. </DataGridTemplateColumn.CellTemplate>
  88. </DataGridTemplateColumn>
  89.  
  90. <DataGridTemplateColumn Header="Size(KB)" CanUserSort="True" SortMemberPath="FileSize">
  91. <DataGridTemplateColumn.HeaderStyle>
  92. <Style TargetType="DataGridColumnHeader">
  93. <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
  94. </Style>
  95. </DataGridTemplateColumn.HeaderStyle>
  96. <DataGridTemplateColumn.CellTemplate>
  97. <DataTemplate>
  98. <TextBlock HorizontalAlignment="Center" Text="{Binding FileSize, StringFormat={}{0:N0}}"></TextBlock>
  99. </DataTemplate>
  100. </DataGridTemplateColumn.CellTemplate>
  101. </DataGridTemplateColumn>
  102. </DataGrid.Columns>
  103. </DataGrid>
  1. //绑定数据后,重新设置排序状态
    gridResult2.ItemsSource = bindDataList;
  2. //设置排序图标
  3. if (IsClickSort)
  4. {
  5. switch (CurrentOrderByEnum)
  6. {
  7. case (OrderByEnum.OrderByNameAsc):
  8. gridResult2.Columns[].SortDirection = ListSortDirection.Ascending ;
  9. break;
  10.  
  11. case (OrderByEnum.OrderByNameDesc):
  12. gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
  13. break;
  14.  
  15. case (OrderByEnum.OrderByModifiedDateAsc):
  16. gridResult2.Columns[].SortDirection = ListSortDirection.Ascending ;
  17. break;
  18.  
  19. case (OrderByEnum.OrderByModifiedDateDesc):
  20. gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
  21. break;
  22.  
  23. case (OrderByEnum.OrderByClassifyAsc):
  24. gridResult2.Columns[].SortDirection = ListSortDirection.Ascending;
  25. break;
  26.  
  27. case (OrderByEnum.OrderByClassifyDesc):
  28. gridResult2.Columns[].SortDirection = ListSortDirection.Descending ;
  29. break;
  30.  
  31. case (OrderByEnum.OrderBySizeAsc):
  32. gridResult2.Columns[].SortDirection = ListSortDirection.Ascending;
  33. break;
  34.  
  35. case (OrderByEnum.OrderBySizeDesc):
  36. gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
  37. break;
  38. }
  39. }
  40. else
  41. {
  42. gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
  43. }
  1. //排序事件
    private void GridResult2_OnSorting(object sender, DataGridSortingEventArgs e)
  2. {
  3. ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ?
  4. ListSortDirection.Ascending : ListSortDirection.Descending;
  5. bool sortAscending = direction == ListSortDirection.Ascending;
  6.  
  7. switch (e.Column.SortMemberPath)
  8. {
  9. case ("FileName"):
  10. if (sortAscending)
  11. {
  12. CurrentOrderByEnum = OrderByEnum.OrderByNameAsc;
  13. }
  14. else
  15. {
  16. CurrentOrderByEnum = OrderByEnum.OrderByNameDesc;
  17. }
  18.  
  19. break;
  20.  
  21. case ("FileModifiedTime"):
  22. if (sortAscending)
  23. {
  24. CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateAsc;
  25. }
  26. else
  27. {
  28. CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateDesc;
  29. }
  30. break;
  31.  
  32. case ("ClassifyType"):
  33. if (sortAscending)
  34. {
  35. CurrentOrderByEnum = OrderByEnum.OrderByClassifyAsc;
  36. }
  37. else
  38. {
  39. CurrentOrderByEnum = OrderByEnum.OrderByClassifyDesc;
  40. }
  41. break;
  42.  
  43. case ("FileSize"):
  44. if (sortAscending)
  45. {
  46. CurrentOrderByEnum = OrderByEnum.OrderBySizeAsc;
  47. }
  48. else
  49. {
  50. CurrentOrderByEnum = OrderByEnum.OrderBySizeDesc;
  51. }
  52. break;
  53. }
  54. IsClickSort = true;
  55. Search();
  56.  
  57. }

WPF DataGrid 服务端排序的更多相关文章

  1. WPF DataGrid分组和排序

    之前一直用的Dev的GridControl,控件自带分组排序啥的.今天试了下在wpf自带的Datagrid控件上实现分组和排序. Datagrid上实现这些功能主要用到CollectionViewSo ...

  2. XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端

    XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端   源起一个App项目,Web服务器就一台,已经装了 ...

  3. miniui datagrid 保存到服务端,使用.NET 自带 JSON 转换时发现日期格式不兼容。

    使用 miniui datagrid 修改表格后,保存到服务端,然后使用 .NET 自带 JSON 转换,会抛出DateTime 内容“2015-12-27T11:02:28”未按 JSON 的要求以 ...

  4. WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

    WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失 ...

  5. 通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页

    通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页 YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.N ...

  6. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  7. WPF DataGrid分页功能实现代码 修改原作者不能实现的部分

    这两天需要给Datagrid加个分页,查找了一些相关的文章,发现有一个写了一个控件比较好,地址是 http://blog.csdn.net/zdw_wym/article/details/822189 ...

  8. 微信签名算法的服务端实现(.net版本)

    一.概要 微信此次开放JS接口,开放了一大批api权限,即使在未认证的订阅号也可以使用图像接口,音频接口,智能接口,地理位置,界面操作,微信扫一扫等功能.要知道:以前订阅号只能接受和被动回复用户消息而 ...

  9. post数据过大到服务端,接收不到的问题

    在页面把datagrid上的数据post到服务端,解析提供导出.datagrid的数据大概有1w. 结果能post过去,但在服务端接收的数据显示null.但是如果post6000条左右就没问题. 经过 ...

随机推荐

  1. 009 webpack将ES高级语法进行装换

    一:ES高级转换 1.main.js中的js不能解析 // js的主要入口 import $ from 'jquery' import './css/index.css' import './css/ ...

  2. android 桌面图标添加数字角标

    是否支持角标并不与手机厂商有关,而是你当前使用的launcher开发厂商有关. 方法实现: import android.app.Application; import android.app.Not ...

  3. SAGAN:Self-Attention Generative Adversarial Networks - 1 - 论文学习

    Abstract 在这篇论文中,我们提出了自注意生成对抗网络(SAGAN),它是用于图像生成任务的允许注意力驱动的.长距离依赖的建模.传统的卷积GANs只根据低分辨率图上的空间局部点生成高分辨率细节. ...

  4. a dynamic resume

    介绍 发现一款开源的动画简历工程, 很是吸引眼球, 分享出来. 技术: 1. npm工程管理 2. vuejs 设计上,将工程分为两个组件: 0.程序入口组件 1. 编辑器组件 2. 简历展示组件 流 ...

  5. Nginx修改时间戳

    1.安装nginx,注意不要安装nginx-common或者nginx-full sudo apt-get install nginx sudo apt-get install nginx-commo ...

  6. Postgresql常用命令汇总

    sudo -u postgres psql #进入postgresql ALTER USER postgres WITH password 'postgres'; #修改postgres用户密码 ps ...

  7. 解决angular+element原有组件样式不能覆盖element自带样式问题

    在对应的组件中写入 ::ng-deep   +     想要改变的element组件样式名即可

  8. 前端向后端获取数据的三种方法:ajax、axios、fetch

    1.jQuery中的ajax get方法: $.ajax({ url:"v4/api/film/now-playing?t=1539401039415&page=1&coun ...

  9. [转帖]LINUX PID 1 和 SYSTEMD

    LINUX PID 1 和 SYSTEMD 2017年07月16日 陈皓 评论 46 条评论  57,176 人阅读 https://coolshell.cn/articles/17998.html ...

  10. c++11多线程记录3: 数据争用和Mutex的使用

    https://www.youtube.com/watch?v=3ZxZPeXPaM4 学习视频 数据争用 简单来说就是存在多个线程同时对某个共同的对象进行读写(至少有一个线程在做写操作),造成读取这 ...