• DataTable排序(转)


    DataTable 排序

     
    DataRow[] rows = dataTable1.Select("", "ord asc");
     
    DataTable t = DataTable1.Clone();
     
    t.Clear();
     
    foreach (DataRow row in rows)
     
        t.ImportRow(row);
     
    DataTable1 = t;
     
    VS2005中这种方法最简单:
    DataView dv = dt.DefaultView;
    dv.Sort = "c1 Asc";
    DataTable dt2 = dv.ToTable();
     
    --------------------------
     
    //拿到数据源
    DataView dv = this.dtDataSource.Copy().DefaultView;
    //排序
    dv.Sort = "款 asc,項 asc,目 asc";
    //过滤重复数据
    //DataTable dt = dv.ToTable(true, "款", "項", "目");
    //不过滤重复数据
    DataTable dt = dv.Table.Copy();  
     
    -----------------------------------------------
     
    关于DataView(DataTable)排序的思考
           因项目需要,在获得<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=dataset&ie=utf-8&src=se_lighten_f">dataset</a>(或者DataTable)之后要对该table进行重新排序,排序规则按照<a target="_blank" style="color: #0000F0; display:inline; position:static; background:none;" href="http://www.so.com/s?q=%E6%95%B0%E7%BB%84&ie=utf-8&src=se_lighten_f">数组</a>fids元素的顺序进行。
     
    在测试的时候,我用简单的思考方法,在table上增加一列dis,来存放该行的主键在fids中的对应项的索引,一个循环之后,dis都被赋了值,现在就要排序了,因为datatable没有排序功能,就选择了转换DataTable为DataView,然后对DataView进行排序,关键代码如下:
     
    DataView dw = dt.DefaultView;
     
    dw.Sort = "dis,发布日期 desc";
     
    然后把dw绑定到DataGird输出,结果正好符合原意。
     
    可是具体使用中却出了问题,因为我对dw又进行了一次处理,取该分页需要的某几项绑定到DataGird,于是结果和排序之前一样,没有了变化。
     
    究其原因,才发现,这里的DataView只是设定了排序规则,并没有实施排序,那么排序在什么时候发生呢,应该是在绑定到DataGird的时候才发生,所以我后来的方法就出了问题。
     
    总结如下:DataView的筛选和排序功能都是在绑定到数据控件的时候才执行的,如果你是简单的需求(也就是说不需要再取其中的部分数据来绑定数据控件),那就可以使用该功能。
     
    我的问题的最终解决方法如下(只使用了简单的循环):
     
    private DataTable SortTable(DataTable dt,string[] pids)
     
             {
     
                  DataTable dt0 = dt.Clone(); //复制原表结构
     
                  for(int i=0;i<pids.Length;i++)
     
                  {
     
                       if(pids[i] != string.Empty)
     
                       {
     
                           DataRow[] drs = dt.Select("pos_id=" + pids[i]);
     
                           if(drs.Length > 0)
     
                           {
     
                                foreach(DataRow dr in drs)
     
                                {
     
                                     dt0.ImportRow(dr); //导入行
     
                                }
     
                           }
     
                       }
     
                  }
     
                  return dt0;
     
         }
     
    说明:就是对排序的数组循环,在datatable中找对应的行,然后复制到新表中。
     
     
    该方法的效率还是可以的,不过如果交集次数大于20,000,000的时候,就会有效率问题。
     
    ****************************************************************
     
      
     
    dstaset.Tables.Add(dt)
    dataset.Tables(0).DefaultView.Sort = "id desc"
     
    dv = New DataView(dt)
    dv.Sort = "id desc"
     
    dv = New DataView(ds.Tables[0])
    dv.Sort = "id desc"-------------------------------------------------------------- System.Data.DataTable table = new System.Data.DataTable();
                table.Columns.Add("aa", typeof(string));
                System.Data.DataRow row = table.NewRow();
                row["aa"] = "sdf";
                table.Rows.Add(row);
     
                System.Data.DataView dv = new System.Data.DataView(table);
     
                table.Columns.Add("bb", typeof(string)); DataTable dt = con.getDGResulthk(sql);
                DataColumn col1 = con.getCol(sql1);
                DataColumn col = dt.Columns.Add("工资");
                DataRow dr = dt.NewRow();
                dr["工资"] = col1;
                dt.Rows.Add(dr);
                dataGridView1.DataSource = dt;
                 
                dataGridView1.AutoResizeColumns();
     System.Data.DataTable table = new System.Data.DataTable();
                table.Columns.Add("aa", typeof(string));
                System.Data.DataRow row = table.NewRow();
                row["aa"] = "sdf";
                table.Rows.Add(row);
     
                System.Data.DataView dv = new System.Data.DataView(table);
     
      
     
      
     
    DataTable drReport=new DataTable();
     
    DataRow[] pdrs111 = dtReport.Select("code=''" + strNoCode + "''");
                            if (pdrs111.Length > 0)
                            {
                                foreach (DataRow dr111 in pdrs111)
                                {
                                    decfd_1 = Convert.ToDouble(dr111["fd"].ToString());
                                    dr111["fd_no"] = dtNOValue;
                                    dr111["fd_no_toal"] = decfd_1 + dtNOValue;
                                }
                            }
     
     
     
      
     
      
     
    dstaset.Tables.Add(dt)
    dataset.Tables(0).DefaultView.Sort = "id desc"
     
    dv = New DataView(ds.Tables[0])
    dv.Sort = "id desc"
     
    from: http://www.cnblogs.com/xiaofengfeng/archive/2012/06/27/2565941.html
  • 相关阅读:
    windows下忘记mysql超级管理员rootpassword的解决的方法
    LeetCode226 InvertBinaryTree Java题解
    PHP利用GD库绘图和生成验证码图片
    自己动手开发IOC容器
    智能提示(一) Solr (suggest)
    Linux系统字符集乱码问题
    Linux
    [Material Design] 教你做一个Material风格、动画的button(MaterialButton)
    codeforces#FF(div2) D DZY Loves Modification
    鼠标滚轮实现图片的缩放-------Day79
  • 原文地址:https://www.cnblogs.com/yuxuetaoxp/p/4021824.html
Copyright © 2020-2023  润新知