对C1FlexGrid for Silverlight中的非空数据行排序

排序供是表格控件必不可少的功能之一,在C1FlexGrid for Silverlight中也提供了该功能,开发人员只需要设置AllowSorting为True就可以通过点击列头对数据安装升序/降序方式进行排序。不过,有时候也有一些特殊的排序要求,本文主要介绍如何实现没有数据的行不参与排序操作。实现思路是,删除没有数据的行,对有数据的行进行排序,将空行数据添加到表格中。

发布于 2012/11/16 00:00

ComponentOne Enterprise

排序供是表格控件必不可少的功能之一,在C1FlexGrid for Silverlight中也提供了该功能,开发人员只需要设置AllowSorting为True就可以通过点击列头对数据安装升序/降序方式进行排序。



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


捕获列头的单击事件:

为了实现自定义的排序功能,首先需要捕获到列头的单击事件,这一功能是通过在C1FlexGrid的Click事件中通过调用HitTest方法来判断当前点击的是否为列头,在Click事件中同事需要将该列的排序方式存放到该列的Tag属性中,代码如下:


  1. 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);
        }
    }

关于葡萄城

葡萄城是专业的软件开发技术和低代码平台提供商,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。葡萄城开发技术始于1980年,40余年来始终聚焦软件开发技术,有深厚的技术积累和丰富的产品线。是业界能够同时赋能软件开发和低代码开发的企业。凭借过硬的产品能力、活跃的用户社区和丰富的伙伴生态,与超过3000家合作伙伴紧密合作,产品广泛应用于信息和软件服务、制造、交通运输、建筑、金融、能源、教育、公共管理等支柱产业。

相关产品
推荐相关案例
关注微信
葡萄城社区二维码

关注“葡萄城社区”

加微信获取技术资讯

加微信获取技术资讯

想了解更多信息,请联系我们, 随时掌握技术资源和产品动态