找回密码
 立即注册

QQ登录

只需一步,快速开始

ZenosZeng 讲师达人认证 悬赏达人认证

超级版主

300

主题

7876

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
13140

活字格认证圣诞拼拼乐微信认证勋章讲师达人元老葡萄悬赏达人

ZenosZeng 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-8-2 09:39  /   查看:7480  /  回复:0
排序供是表格控件必不可少的功能之一,在C1FlexGrid for Silverlight中也提供了该功能,开发人员只需要设置AllowSorting为True就可以通过点击列头对数据安装升序/降序方式进行排序。

不过,有时候也有一些特殊的排序要求,本文主要介绍如何实现没有数据的行不参与排序操作。实现思路是,删除没有数据的行,对有数据的行进行排序,将空行数据添加到表格中。

捕获列头的单击事件:
为了实现自定义的排序功能,首先需要捕获到列头的单击事件,这一功能是通过在C1FlexGrid的Click事件中通过调用HitTest方法来判断当前点击的是否为列头,在Click事件中同事需要将该列的排序方式存放到该列的Tag属性中,代码如下:
  1.     void c1FlexGrid1_Click(object sender, MouseButtonEventArgs e)
  2.     {
  3.         var ht = c1FlexGrid1.HitTest(e);

  4.         if (ht.CellType == C1.Silverlight.FlexGrid.CellType.ColumnHeader)
  5.         {
  6.             var col = c1FlexGrid1.Columns[ht.Column];

  7.             var sortDirection = (col.Tag is ListSortDirection) && (ListSortDirection)col.Tag == ListSortDirection.Ascending
  8.                 ? ListSortDirection.Descending
  9.                 : ListSortDirection.Ascending;

  10.             col.Tag = sortDirection;

  11.             for (int i = 0; i < c1FlexGrid1.Columns.Count; i++)
  12.             {
  13.                 if (i != ht.Column)
  14.                     c1FlexGrid1.Columns[i].Tag = null;
  15.             }

  16.             SortColumn(col, sortDirection);
  17.         }

  18.         c1FlexGrid1.CellFactory = new SortCellFactory();
  19.     }
复制代码


对C1FlexGrid进行排序:
在上一步操作中我们调用了SortColumn方法对C1FlexGrid进行排序,SortColumn方法接收两个参数col和sortDirection。在该方法中有两个List的实例,一个用于存放空数据行,一个存放有数据的行。
接下来我们将自己实现对数据的排序操作,而不再使用C1FlexGrid默认的过滤方式。为了实现自定义的过滤功能,需要定义一个继承于IComparer接口的类,在非空数据列表排序完成之后,将C1FlexGrid中的行清空,将已经排序的非空数据列表中的数据添加到C1FlexGrid中,然后将空数据行添加到C1FlexGrid中,代码如下:

  1.     void SortColumn(Column col, ListSortDirection sortDirection)
  2.     {
  3.         var list = new List<Row>();
  4.         var emptyRows = new List<Row>();

  5.         bool isEmptyRow = true;

  6.         foreach (var row in c1FlexGrid1.Rows)
  7.         {
  8.             foreach (var column in c1FlexGrid1.Columns)
  9.             {
  10.                 if (c1FlexGrid1[row.Index, column.Index] == null || c1FlexGrid1[row.Index, column.Index].ToString() == "")
  11.                 {
  12.                     isEmptyRow = true;
  13.                 }
  14.                 else
  15.                 {
  16.                     isEmptyRow = false;
  17.                     break;
  18.                 }
  19.             }

  20.             if (isEmptyRow)
  21.                 emptyRows.Add(row);
  22.             else
  23.             {
  24.                 list.Add(row);
  25.             }
  26.         }

  27.         list.Sort(new RowComparer(col, sortDirection));

  28.         c1FlexGrid1.Rows.Clear();

  29.         foreach (var row in list)
  30.         {
  31.             c1FlexGrid1.Rows.Add(row);
  32.         }

  33.         foreach (var row in emptyRows)
  34.         {
  35.             c1FlexGrid1.Rows.Add(row);
  36.         }
  37.     }
复制代码


运行截图:





源码下载:VS2010 + ComponentOne Studio for Silverlight 2012V2
C#:
VB.NET:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部