DataTable实例中的数据排序

 

   碰到一个经费统计页面,需要对统计后的结果按照金额进行排序,本来想老实的用老算法——快速排序,但由于统计结果是以数据表的形式存在于DataTable实例内,每一条数据都是一个DataRow实例,金额只是其中的一列,即一个属性,这样算法应用起来就很不方便。于是一贯“懒惰”成性的我就开始寻找另外的方法,查阅了相关资料后终于发现两种可行的方法,记录如下:
  法一: DataView view = dtTbl.DefaultView;(dtTbl 是个 DataTable实例)
        view.Sort = "[column], [column],...,[column] ASC|DESC";
    注: 声明一个DataView实例的引用,将它指向DataTable实例的DefaultView属性,然后用DV对象的属性Sort进行排序,此属性类型是个string,[column]表示要用来作为排序标准的列名,可以有多列,从左向右排序优先级递减,ASC|DESC表示“升序”还是“降序”。不过此方法只能改表DataTable的显示方式,并不能直接改变内存里的DataRow集合的顺序,如果是把DataTable作为某个控件的间接数据源(比如DataGrid的一个DataSet数据源中的一个表),那么该控件显示出来的结果仍然是未排序的情况。
  法二:DataRow[] rows = dtTbl.Select("", "[column] ASC|DESC");
        DataTable tblCopy = new DataTable("tablename");
        tblCopy = dtTbl.Clone();
        foreach (DataRow row in rows)
        {
            tblRCopy.ImportRow(row);
        }
    注:如上生成了一个dtTbl的Copy(tblCopy = dtTbl.Clone()),即架构完全一样的空表,同时用DataTable类的实例方法Select()返回了由dtTbl中所有DataRow按ASC或者DESC排序的DataRow数组。改方法MSDN里解释得相当详细,这里不赘述。然后用一个foreach循环把排好序的DataRow数组导入新生成的DataTable,如果后面要用到排序,只要把数据集改成这个tblCopy就可以了。这里由于是新生成的DataTable,同时有重新导入了DataRow,即在内存中新开辟了一块数据区域,这样显示结果就不会变了。
    注意! 法二中不能在返回排序数组后用dtTbl.Clear()方法清空dtTbl,然后用dtTbl重新导入rows, 因为 rows数组中的各项只是对dtTbl中各DataRow的引用,是浅复制,不是深复制,即只是指向原dtTbl的rows内存区,变的只是引用的顺序,而不是原dtTbl的rows的顺序,所以清空dtTbl,就相当于清空了数据源,import的结果就是空的tblCopy!
原文地址:https://www.cnblogs.com/bicabo/p/1753354.html