转载: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"  >

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

 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>)
{
if(view.SortDescriptions[].PropertyName== e.Column.SortMemberPath)
{
if (view.SortDescriptions[].Direction == System.ComponentModel.ListSortDirection.Ascending)
{
pager.Order = "desc";
}
else if (view.SortDescriptions[].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);

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

补充:

文中提到:我在这里为它赋值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;

}​

 

代码:

                                <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">
<!--SelectionChanged="GridResult2_OnSelectionChanged" -->
<!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
<DataGrid.CommandBindings>
<CommandBinding Command="Copy" Executed="CopyCommand" />
</DataGrid.CommandBindings> <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
<DataGrid.InputBindings>
<KeyBinding Key="C" Modifiers="Control" Command="Copy" />
</DataGrid.InputBindings> <DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Name="ChkAll" ToolTip="All" Content="All" IsChecked="False" Unchecked="UnAll_Checked" Checked="All_Checked"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Checked="ItemFile_OnChecked" Unchecked="ItemFile_OnUnchecked" Tag="{Binding FilePath}" HorizontalAlignment="Center" x:Name="itemFile" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTemplateColumn Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding SnapshotPath}" Height="" Width="" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTextColumn Header="Name" Binding="{Binding FileName}" />
<DataGridTemplateColumn Header="MD5">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Text="{Binding FileMD5}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTemplateColumn Header="Modified Date" CanUserSort="True" SortMemberPath="FileModifiedTime">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Text="{Binding FileModifiedTime}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTextColumn Header="Path" Binding="{Binding FilePathNoName}" /> <DataGridTemplateColumn Header="Classify Type" CanUserSort="True" SortMemberPath="ClassifyType">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Text="{Binding ClassifyType}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTemplateColumn Header="Type">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Text="{Binding FileExtension}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTemplateColumn Header="Size(KB)" CanUserSort="True" SortMemberPath="FileSize">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Text="{Binding FileSize, StringFormat={}{0:N0}}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
//绑定数据后,重新设置排序状态     
gridResult2.ItemsSource = bindDataList;
//设置排序图标
if (IsClickSort)
{
switch (CurrentOrderByEnum)
{
case (OrderByEnum.OrderByNameAsc):
gridResult2.Columns[].SortDirection = ListSortDirection.Ascending ;
break; case (OrderByEnum.OrderByNameDesc):
gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
break; case (OrderByEnum.OrderByModifiedDateAsc):
gridResult2.Columns[].SortDirection = ListSortDirection.Ascending ;
break; case (OrderByEnum.OrderByModifiedDateDesc):
gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
break; case (OrderByEnum.OrderByClassifyAsc):
gridResult2.Columns[].SortDirection = ListSortDirection.Ascending;
break; case (OrderByEnum.OrderByClassifyDesc):
gridResult2.Columns[].SortDirection = ListSortDirection.Descending ;
break; case (OrderByEnum.OrderBySizeAsc):
gridResult2.Columns[].SortDirection = ListSortDirection.Ascending;
break; case (OrderByEnum.OrderBySizeDesc):
gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
break;
}
}
else
{
gridResult2.Columns[].SortDirection = ListSortDirection.Descending;
}
//排序事件
private void GridResult2_OnSorting(object sender, DataGridSortingEventArgs e)
{
ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ?
ListSortDirection.Ascending : ListSortDirection.Descending;
bool sortAscending = direction == ListSortDirection.Ascending; switch (e.Column.SortMemberPath)
{
case ("FileName"):
if (sortAscending)
{
CurrentOrderByEnum = OrderByEnum.OrderByNameAsc;
}
else
{
CurrentOrderByEnum = OrderByEnum.OrderByNameDesc;
} break; case ("FileModifiedTime"):
if (sortAscending)
{
CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateAsc;
}
else
{
CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateDesc;
}
break; case ("ClassifyType"):
if (sortAscending)
{
CurrentOrderByEnum = OrderByEnum.OrderByClassifyAsc;
}
else
{
CurrentOrderByEnum = OrderByEnum.OrderByClassifyDesc;
}
break; case ("FileSize"):
if (sortAscending)
{
CurrentOrderByEnum = OrderByEnum.OrderBySizeAsc;
}
else
{
CurrentOrderByEnum = OrderByEnum.OrderBySizeDesc;
}
break;
}
IsClickSort = true;
Search(); }

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. java base64编码解码

    第一种.DatatypeConverter 使用JDK自带DatatypeConverter.java类实现,JDK版本必须>=1.6 /** * @Description base64编码 * ...

  2. some try on func swap about & and *

    import "fmt" func swap(x,y *int ) { //x ,y = y,x //fault /* t := *x *x = *y *y = t */ //tr ...

  3. 【漫谈数据仓库】 如何优雅地设计数据分层 ODS DW DM层级

    转载http://bigdata.51cto.com/art/201710/554810.htm 一.文章主题 本文主要讲解数据仓库的一个重要环节:如何设计数据分层!其它关于数据仓库的内容可参考之前的 ...

  4. 【Spring Cloud学习之二】服务注册和发现

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.EurekaEureka是Netflix开源的一个RESTful服务,主要用于服 ...

  5. CentOS7.5 使用 kubeadm 安装配置 Kubernetes1.12(四)

    在之前的文章,我们已经演示了yum 和二进制方式的安装方式,本文我们将用官方推荐的kubeadm来进行安装部署. kubeadm是 Kubernetes 官方提供的用于快速安装Kubernetes集群 ...

  6. .net桌面程序或者控制台程序使用NLog时的注意事项

    Nuget添加NLog 添加nlog.config文件,并选择属性->始终复制 不选择始终复制,编译后nlog.config是没有的. 具体使用: private static readonly ...

  7. 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

    2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...

  8. mysql新增用户无法授权!? 解决方案

    先上解决方法  :) 创建用户cat 密码 CREATE USER '; 修改user表中的注册用户cat update user set host='%' where user='cat'; 授权: ...

  9. LeetCode 394. 字符串解码(Decode String) 44

    394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...

  10. [转帖]在VirtualBox Linux 7u2 中安装Oracle RAC 12.2.0.1.0

    https://xiaoyu.blog.csdn.net/article/details/81980936