默认情况下,即便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