默认情况下,即便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
时间: 2024-11-11 18:09:32