DataTable排序结果的纠正

时间:2022-04-24
本文章向大家介绍DataTable排序结果的纠正,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.DefaultView.Sort ="XXX ASC"排序时,都是按字符串排序处理的,并不是我们想要的结果,下面给出了二种解决办法:

using System;
using System.Data;

namespace DataTableSortSample
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Month");
            dt.Rows.Add("1");
            dt.Rows.Add("11");
            dt.Rows.Add("2");
            dt.Rows.Add("12");
            dt.DefaultView.Sort = "Month ASC";
            dt = dt.DefaultView.ToTable();

            foreach (DataRow s in dt.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            Console.WriteLine("----------------------------------");


            #region 方法1:将月份补齐为2位 (前提:补齐这种方案并非所有需求都能接受,这个要看该列的业务含义)
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dt.Rows[i]["Month"] = dt.Rows[i]["Month"].ToString().PadLeft(2, '0');
            }
            dt.DefaultView.Sort = "Month ASC";

            dt = dt.DefaultView.ToTable();

            foreach (DataRow s in dt.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            #endregion

            Console.WriteLine("----------------------------------");

            #region 方法2:建一个新DataTable,将Month列类型,修改成int型,然后导入数据
            DataTable dtNew = dt.Clone();
            dtNew.Columns["Month"].DataType = typeof (int);//重新指定列类型为int型
            foreach (DataRow s in dt.Rows)
            {
                dtNew.ImportRow(s);//导入旧数据
            }

            dtNew.DefaultView.Sort = "Month ASC";
            dtNew = dtNew.DefaultView.ToTable();

            foreach (DataRow s in dtNew.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            #endregion
            Console.Read();

        }
    }
}

  运行结果:

1 11 12 2 ---------------------------------- 01 02 11 12 ---------------------------------- 1 2 11 12