DataTable.DefaultView.Sort在按DateTime列排序时未正确排序

时间:2015-03-02 11:30:15

标签: c# asp.net sorting datetime datatable

我有一个数据表,其中有四列,如下所示:

DataTable Quarters = new DataTable();
Quarters.Columns.Add("QuarterId", typeof(int));
Quarters.Columns.Add("Quarter");
Quarters.Columns.Add("StartDate", typeof(DateTime));
Quarters.Columns.Add("EndDate", typeof(DateTime));

使用代码填充数据后,我想按照DateTime类型的开始日期字段对数据表行进行排序。

为此,我编写了以下代码行:

Quarters.DefaultView.Sort = "StartDate";

但是在得到数据之后我得不到合适的输出。日期被视为字符串。

排序数据后我的输出如下(下面的图像是监视窗口而不是我的网格):

enter image description here

如何正确排序记录?

2 个答案:

答案 0 :(得分:1)

你是对的。我对另一个问题感到困惑。

执行此工作人员创建一个新的类CustomDateClass,它实现IComparable接口并具有属性DateProperty typeof(DateTime)

然后重写CompareTo方法以比较DateTimePromerty。

public int CompareTo(object obj)
        {
            if (obj is CustomDateClass)
            {
                DateTime dt = ((CustomDateClass)obj).DateProperty;
                return dt.CompareTo(DateProperty);
            }
              throw new ArgumentException("not CustomDateClass");
        }

对于您的DataTable更改DateLine:

Quarters.Columns.Add("EndDate", typeof(CustomDateClass));

答案 1 :(得分:0)

我会向你展示不同的(我认为合适的)方式。 首先,让我们为这些数据创建一个类:

public class classNameGoesHere
{
    public int QuarterId { get; set; }
    public string Quarter{ get; set; }
    public DateTime StartDate{ get; set; }
    public DateTime EndDate{ get; set; }
}

现在,在你的班级中负责处理这些数据 - 让我们来处理这个问题。

首先创建一个数据类列表。

List<classNameGoesHere> listName = new List<classNameGoesHere>();

现在,让我们使用简单的LinQ查询填充此列表。

listName = from x in Quarters.AsEnumerable()
           order by x.StartDate descending // sorting is beeing done here
           select new classNameGoesHere
           {
               QuarterId = x.field<int>("QuarterId"),
               Quarter = x.field<string>("Quarter"),
               StartDate = x.field<DateTime>("StartDate"),
               EndDate = x.field<DateTime>("EndDate")                  
           };

现在,您可以将此绑定到DataGrid.ItemsSource。 实际上,如果可能的话 - 没有任何DataTable这样做会更好。而不是puplating DataTable - 在我显示你的列表中填充你的数据。(可能只是一点点重构代码)。 我希望它会有所帮助。