Silverlight学习笔记二(续)

本文介绍了一种在WPF应用程序中实现数据表格排序的方法。通过监听鼠标点击事件,手动在ColumnHeader上添加升序和降序标记来指示排序状态。此外,还提供了完整的代码示例。

上篇中在设置排序标志的时候,需要不停的去刷新,这样做肯定是不行的,所以必须要找到其它的方式。

看了一下关于自定义ColumnHeader的内容,在2.0的测试版本中,可以直接设置Column.Header为某个自定义的控件,但是在正式版中,这个功能被取消了,必须要通过Column.HeaderStyle来设置,动态设置Style还是比较费事的,暂时还没有做好。

所以想了个折中的办法,就是在Header上面手工加上"↑"和"↓"来标示排序的方向。

所要做的就是在MouseDown中修改一下Header.Content

代码如下:

   

 1 private void dgData_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 2         {
 3             var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), dgData)
 4                     where element is DataGridColumnHeader
 5                     select element;
 6 
 7             if (u.Count() == 1)
 8             {
 9                 //鼠标点击的ColumnHeader
10                 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
11                 //要排序的字段
12                 string _newsort = header.Content.ToString();
13                 //清除名称中的↑和↓
14                 _newsort = removeSortStateFlag(_newsort);
15                 //判断排序方向
16                 if (_newsort == sortFiled)
17                     dir = dir == "desc" ? "asc" : "desc";
18                 else
19                 {
20                     //如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
21                     if (sortHeader!=null)
22                         sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
23                     dir = "asc";
24                 }
25                 sortFiled = _newsort;
26                 //加上排序标志
27                 header.Content = dir == "asc" ? _newsort + " ↑" : _newsort + " ↓";
28                 //设置新的排序字段为当前排序字段
29                 sortHeader = header;
30                 BindGrid();
31                 e.Handled = true;
32             }
33             else
34                 e.Handled = false;
35         }

完整的代码如下:

ContractedBlock.gifExpandedBlockStart.gifCode
  1     public partial class ProductsList : UserControl
  2     {
  3         private List<Products> products_list;
  4         private Pager pager = null;
  5         //当前排序的字段
  6         private string sortFiled = "ProductID";
  7         //当前排序的方向
  8         private string dir = "asc";
  9         //当前排序的ColumnHeader
 10         private DataGridColumnHeader sortHeader;
 11 
 12         public ProductsList()
 13         {
 14             InitializeComponent();
 15             MouseHelper.SetMouseWheelHandler(OnMouseWheel);
 16             BindGrid();
 17         }
 18 
 19         private void BindGrid()
 20         {
 21             canvas.Visibility = Visibility.Visible;
 22             var client = new NorthWindWCF.NorthWindWCFClient();
 23             client.GetProductsPagingCompleted += new EventHandler<GetProductsPagingCompletedEventArgs>(client_GetProductsPagingCompleted);
 24             int start = 1;
 25             int limit = 10;
 26             if (pager != null)
 27                 start = (pager.PageIndex - 1* 10 + 1;
 28             client.GetProductsPagingAsync(start, limit, sortFiled, dir);
 29         }
 30 
 31         public void OnMouseWheel(object sender, MouseWheelHandlerEventArgs args)
 32         {
 33             if (Parent == nullreturn;
 34             sv.ScrollToVerticalOffset(sv.VerticalOffset - args.Delta * 15);
 35         }
 36 
 37         private void client_GetProductsPagingCompleted(object sender, GetProductsPagingCompletedEventArgs e)
 38         {
 39             if (e.Error == null)
 40             {
 41                 products_list = e.Result.ToList();
 42                 dgData.ItemsSource = products_list;
 43                 if (pager == null)
 44                 {
 45                     pager = new Pager(e.TotalPage, 2);
 46                     pager.Click += new Pager.PagerButtonClick(pager_Click);
 47                     pager.PageIndex = 1;
 48                     spPager.Children.Clear();
 49                     spPager.Children.Add(pager);
 50                 }
 51             }
 52             else
 53                 MessageBox.Show(e.Error.Message);
 54             canvas.Visibility = Visibility.Collapsed;
 55         }
 56 
 57         private void pager_Click(object sender, RoutedEventArgs e)
 58         {
 59             BindGrid();
 60         }
 61 
 62         private void dgData_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 63         {
 64             var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), dgData)
 65                     where element is DataGridColumnHeader
 66                     select element;
 67 
 68             if (u.Count() == 1)
 69             {
 70                 //鼠标点击的ColumnHeader
 71                 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
 72                 //要排序的字段
 73                 string _newsort = header.Content.ToString();
 74                 //清除名称中的↑和↓
 75                 _newsort = removeSortStateFlag(_newsort);
 76                 //判断排序方向
 77                 if (_newsort == sortFiled)
 78                     dir = dir == "desc" ? "asc" : "desc";
 79                 else
 80                 {
 81                     //如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
 82                     if (sortHeader != null )
 83                         sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
 84                     dir = "asc";
 85                 }
 86                 sortFiled = _newsort;
 87                 //加上排序标志
 88                 header.Content = dir == "asc" ? _newsort + " ↑" : _newsort + " ↓";
 89                 //设置新的排序字段为当前排序字段
 90                 sortHeader = header;
 91                 BindGrid();
 92                 e.Handled = true;
 93             }
 94             else
 95                 e.Handled = false;
 96         }
 97 
 98         private string removeSortStateFlag(string dir)
 99         {
100             int pos = dir.IndexOfAny(new char[] { '''' });
101             if (pos > 0) dir = dir.Substring(0, pos - 1);
102             return dir;
103         }
104 

 

最终效果:

转载于:https://www.cnblogs.com/libra163/archive/2008/12/26/1362805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值