遇到的问题:
一、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;
}
}