WPF 记住 DataGrid 刷新前点击的排序列标题

遇到的问题:

一、DataGrid 默认点击列标题,是对已取到的数据排序。

二、如果给 DataGrid 重新指定数据源(如:我点击搜索按钮或者操作底部的翻页),列标题“保证时间”上的排序箭头就会消失。

解决方法:

先理解下两个属性

Column.SortDirection,可以简单理解成列标题的排序箭头(向上或向下)
Column.SortMemberPath,可以简单理解成这个列所绑定的某个字段名

然后看源码

public partial class Window1 : Window
{
    string _columnHeader = "";  //用来记住已点击列标题的 Column.Header
    ListSortDirection? _columnListSortDirection = null; //用来记住已点击列标题的 Column.SortDirection
    string _columnSortMemberPath = "";  //用来记住已点击列标题的 Column.SortMemberPath

    public Window1()
    {
        InitializeComponent();

        dataGrid1.Sorting += DataGrid1_Sorting;
        button1.Click += Button1_Click;

        //这里最好设置下默认的排序列
        dataGrid1.Columns[0].SortDirection = ListSortDirection.Descending;
    }
    //列标题点击事件处理器
    private void DataGrid1_Sorting(object sender, DataGridSortingEventArgs e)
    {
        DataGridColumn cl = e.Column;

        //这一段处理都是为了记住“被点击的列标题”
        _columnHeader = cl.Header.ToString();
        if (cl.SortDirection == null)
        {
            //默认情况下:未点击的列标题的 SortDirection=null,Sorting() 事件之后才设置为 SortDirection = ListSortDirection.Ascending
            //这里让它在排序前,就把排序按钮设置为升序
            _columnListSortDirection = ListSortDirection.Ascending;
        }
        else
        {
            //切换升序倒序箭头
            _columnListSortDirection = cl.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
        }
        _columnSortMemberPath = cl.SortMemberPath;

        BindGrid();//重新绑定数据源
        e.Handled = true;//表示事件已处理,不需要默认的排序处理
    }
    //搜索按钮点击事件处理器
    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        BindGrid();
    }
    //数据库取数据,然后绑定到 DataGrid
    private void BindGrid()
    {
        string sortStr = getSortStr();
        int total = 0;
        dataGrid1.ItemsSource =  getData(sortStr, 1, 50, ref total);

        //DataGrid 重新指定数据源之后,之前点击的列标题的排序按钮不见了怎么办,加上这个
        foreach (var cl in dataGrid1.Columns)
        {
            if (cl.Header == _columnHeader)
                cl.SortDirection = _columnListSortDirection;
        }
    }
    //用当前点击的列标题组装 order by 语句
    private string getSortStr()
    {
        string sortDirection = _columnListSortDirection == ListSortDirection.Ascending ? "asc" : "desc";
        return $"order by {_columnSortMemberPath} {sortDirection}";//结果示例:"order by id desc"
    }
    //数据库取数据(伪代码)
    private List<int> getData(string orderBy, int pageIndex, int pageSize, ref int total)
    {
        var list =  new List<int>();
        for (int i = 0; i < 100; i++)
        {
            list.Add(i);
        }
        return list;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagamaw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值