排序供是表格控件必不可少的功能之一,在C1FlexGrid for Silverlight中也提供了该功能,开发人员只需要设置AllowSorting为True就可以通过点击列头对数据安装升序/降序方式进行排序。
不过,有时候也有一些特殊的排序要求,本文主要介绍如何实现没有数据的行不参与排序操作。实现思路是,删除没有数据的行,对有数据的行进行排序,将空行数据添加到表格中。
捕获列头的单击事件:
为了实现自定义的排序功能,首先需要捕获到列头的单击事件,这一功能是通过在C1FlexGrid的Click事件中通过调用HitTest方法来判断当前点击的是否为列头,在Click事件中同事需要将该列的排序方式存放到该列的Tag属性中,代码如下:
void c1FlexGrid1_Click(object sender, MouseButtonEventArgs e) { var ht = c1FlexGrid1.HitTest(e); if (ht.CellType == C1.Silverlight.FlexGrid.CellType.ColumnHeader) { var col = c1FlexGrid1.Columns[ht.Column]; var sortDirection = (col.Tag is ListSortDirection) && (ListSortDirection)col.Tag == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending; col.Tag = sortDirection; for (int i = 0; i < c1FlexGrid1.Columns.Count; i++) { if (i != ht.Column) c1FlexGrid1.Columns[i].Tag = null; } SortColumn(col, sortDirection); } c1FlexGrid1.CellFactory = new SortCellFactory(); }
对C1FlexGrid进行排序:
在上一步操作中我们调用了SortColumn方法对C1FlexGrid进行排序,SortColumn方法接收两个参数col和sortDirection。在该方法中有两个List的实例,一个用于存放空数据行,一个存放有数据的行。
接下来我们将自己实现对数据的排序操作,而不再使用C1FlexGrid默认的过滤方式。为了实现自定义的过滤功能,需要定义一个继承于IComparer 接口的类,在非空数据列表排序完成之后,将C1FlexGrid中的行清空,将已经排序的非空数据列表中的数据添加到C1FlexGrid中,然后将空数据行添加到C1FlexGrid中,代码如下:
void SortColumn(Column col, ListSortDirection sortDirection)
{
var list = new List<Row>();
var emptyRows = new List<Row>();
bool isEmptyRow = true;
foreach (var row in c1FlexGrid1.Rows)
{
foreach (var column in c1FlexGrid1.Columns)
{
if (c1FlexGrid1[row.Index, column.Index] == null || c1FlexGrid1[row.Index, column.Index].ToString() == "")
{
isEmptyRow = true;
}
else
{
isEmptyRow = false;
break;
}
}
if (isEmptyRow)
emptyRows.Add(row);
else
{
list.Add(row);
}
}
list.Sort(new RowComparer(col, sortDirection));
c1FlexGrid1.Rows.Clear();
foreach (var row in list)
{
c1FlexGrid1.Rows.Add(row);
}
foreach (var row in emptyRows)
{
c1FlexGrid1.Rows.Add(row);
}
}
ComponentOne Enterprise | 下载试用
ComponentOne 是一套专注于企业 .NET开发、支持 .NET Core 平台,并完美集成于 Visual Studio 的第三方控件集,包含 300 多种 .NET开发控件,提供表格数据管理、数据可视化、报表和文档、日程安排、输入和编辑、导航和布局、系统提升工具等七大功能,被誉为“.NET开发的‘瑞士军刀’”。
ComponentOne 为您提供专业的产品咨询服务,并由技术支持工程师为您1对1解答。>> 发帖提问
葡萄城热门产品


