我自已构建了一个DataTable,想在这个DataTable的基础上先根据某个字段排序,然后取排名在前6位的数据,不足6位的全部显示。
例:
kmno               kmmc                    pay
404-1              现金支出                25000
404-6-5-7          工资                    180000
404-8-9-2          材料                    15000
404-2              燃料                    30000
444-8              折旧                    2600
450-8-6-3          其它                    100
412-8              电力                    2600
我想实现的是先按pay排序,然后取前6位。注意由于条件限制,不能用sql语句从数据库中直接读取并筛选,不能用诸如select * from (select * from tab order by pay asc) where rownum<=6的语句,完全用DataTable的defaultview来实现,有点难为大家了,但没办法:)

解决方案 »

  1.   

    我知道,datatabel dtb.defaultview.sort='pay',asc;
    但如果取前6位呀?我的筛选条件不是pay超过多少金额的这种条件,而是按顺序在前几位的row.
      

  2.   

    DataView 里可以排序。然后你新建一个 DataTable,把前6条 copy 进去不就结了。
      

  3.   

    你应该可以使用DataView的RowFilter方法呀。
      

  4.   

    我知道dataview有rowfilter方法,但请指教在里rowfilter的条件是什么?pay>2600??这个2600是可变的呀?而且事先也不知道在前6个值的临界值是多少?直接拿前6条应该怎样拿?最好给出示例?
      

  5.   

    // 建一个新表,结构与源表相同
    DataTable newTable = new DataTable();
    foreach (DataColumn column in yourDataTable.Columns)
    {
      DataColumn newColumn = new DataColumn(column.ColumnName, column.DataType);
      newTable.Columns.Add(newColumn);
    }// 获得视图,并排序
    DataView vw = yourDataTable.DefaultView;
    vw.Sort = "pay asc";// 将视图的前6条拷贝到新表中
    for (int i = 0; i < 6; i++)
    {
      if (i > vw.Count) break;
      newTable.ImportRow(vw[i].Row);
    }newTable 里就是你要的结果了。
      

  6.   

    1.可以先做源表的一份拷贝DataTable dtBackup = dt.Copy();
    2.然后用拷贝表
    DataRow[] dr = dtBackup.Select("1 = 1","字段名 ASC");或DataRow[] dr = dtBackup.Select("1 = 1","字段名 DESC");
    3.然后将源表清空
    dt.Clear()
    4.最后将dr中的纪录添加到源表就可以了 for(int i = 0;i < dr.Length;i++)
    {
    DataRow dr = dt.NewRow();
    foreach(DataColumn dc in dt.Columns)
    {
    dt[dc.ColumnName] = dr[i][dc.ColumnName];
    }
    dt(dr);
    }