zoukankan      html  css  js  c++  java
  • dataTabel转成dataview插入列后排序

     if (!string.IsNullOrEmpty(strQuyu) && !string.IsNullOrEmpty(strZuhao))
                {
                    string[] param = { 
                                 };
                    dt = proB.GetProcedureTable("pro_jetj", param, "pro_jetj");
                }
    
                dt.Columns.Add("C");
                //循环加入一列的数据
                foreach (DataRow row in dt.Rows)
                    row["C"] = row["countMoneySg"].ToString() + row["countMoneySj"].ToString() + row["countMoneyYF"].ToString() + row["countMoneyJJ"].ToString();
    
                DataView dv = dt.DefaultView;
                dv.Sort = "C";
    
                rpt_Jepm.DataSource = dt;
                rpt_Jepm.DataBind();
     dt_tj = proB.GetProcedureTable("pro_GetCgl", param, "pro_GetCgl");
    
                        //此处把成功率加进来,即加五个列
                        dt_tj.Columns.Add("A");
                        dt_tj.Columns.Add("B");
                        dt_tj.Columns.Add("C");
                        dt_tj.Columns.Add("D");
                        dt_tj.Columns.Add("E");
                        
                        DataView dv = new DataView();

     

    之前的没有指定列的类型,以至于出现排序是按第一个数字排的顺序(如图),其实可以理解,没有给他指定类型那么他默认就是object类型,现在改了,在添加列的时候并给其添加类型:

     dt_tj = proB.GetProcedureTable("pro_GetCgl", param, "pro_GetCgl");
    
                        //此处把成功率加进来,即加五个列
                        dt_tj.Columns.Add("A",typeof(double));
                        dt_tj.Columns.Add("B",typeof(double));
                        dt_tj.Columns.Add("C", typeof(double));
                        dt_tj.Columns.Add("D",typeof(double));
                        dt_tj.Columns.Add("E",typeof(double));
                        
                        DataView dv = new DataView();
                        //循环加入一列的数据
                        if (dt_tj.Rows.Count > 0)
                        {
                            foreach (DataRow row in dt_tj.Rows)
                            {
                                if (string.IsNullOrEmpty(row["bgq"].ToString().Trim()) || row["syq"].ToString().Trim() == "0")
                                {
                                    row["A"] = "0";
                                }
                                else
                                {
                                    row["A"] = Convert.ToDouble((Convert.ToDouble(row["bgc"].ToString().Trim()) / Convert.ToDouble(row["bgq"].ToString().Trim())*100).ToString("0.00"));
                                }
    
                                if (string.IsNullOrEmpty(row["cyq"].ToString().Trim()) || row["cyq"].ToString().Trim() == "0")
                                {
                                    row["B"] = "0";
                                }
                                else
                                {
                                    row["B"] = Convert.ToDouble((Convert.ToDouble(row["cyc"].ToString().Trim()) / Convert.ToDouble(row["cyq"].ToString().Trim()) * 100).ToString("0.00"));
                                }
    
                                if (string.IsNullOrEmpty(row["syq"].ToString().Trim()) || row["syq"].ToString().Trim() == "0")
                                {
                                    row["C"] = "0";
                                }
                                else
                                {
                                    row["C"] =Convert.ToDouble((Convert.ToDouble(row["syc"].ToString().Trim()) / Convert.ToDouble(row["syq"].ToString().Trim()) * 100).ToString("0.00"));
                                }
    
                                if (string.IsNullOrEmpty(row["jdq"].ToString().Trim()) || row["jdq"].ToString().Trim() == "0")
                                {
                                    row["D"] = "0";
                                }
                                else
                                {
                                    row["D"] =Convert.ToDouble(( Convert.ToDouble(row["jdc"].ToString().Trim()) / Convert.ToDouble(row["jdq"].ToString().Trim()) * 100).ToString("0.00"));
                                }
    
                                if (string.IsNullOrEmpty(row["qtq"].ToString().Trim()) || row["qtq"].ToString().Trim() == "0")
                                {
                                    row["E"] = "0";
                                }
                                else
                                {
                                    row["E"] = Convert.ToDouble((Convert.ToDouble(row["qtc"].ToString().Trim()) / Convert.ToDouble(row["qtq"].ToString().Trim()) * 100).ToString("0.00"));
                                }
                            }

    这才是想要的结果。

    下面是另一种排序方法:

     DataRow[] rows = dt_tj.Select("", "[A] DESC");
                            DataTable tblCopy = new DataTable("tablename");
                            tblCopy = dt_tj.Clone();
                            foreach (DataRow row in rows)
                            {
                                tblCopy.ImportRow(row);
                            }
                            dt_tj = tblCopy;
     注:如上生成了一个 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!





    附:
    dc.DataType = typeof(bool);
    dc.DataType = typeof(System.Boolean);
    dc.DataType = Type.GetType("System.Boolean");// 这句效率底下,不建议使用,
  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/tianrui/p/3326746.html
Copyright © 2011-2022 走看看