无法在C#中的DataTable / DataView中对DATE列进行排序

时间:2013-05-14 06:59:01

标签: c# datetime datatable dataview

我正在尝试在C#中对DataView进行排序。似乎DataView Class的Sort方法将日期作为字符串。

在输出中得到这个 -

5/9/2013 4:56:38 PM
5/8/2013 4:23:06 PM
5/8/2013 1:38:21 PM
5/7/2013 9:55:30 PM
5/7/2013 7:54:45 PM
5/7/2013 7:44:10 PM
5/7/2013 7:44:10 PM
5/7/2013 12:26:38 PM
5/7/2013 1:44:06 PM
5/6/2013 4:08:54 PM
5/6/2013 10:32:49 AM
5/4/2013 7:54:23 PM
5/4/2013 12:57:21 PM
5/3/2013 3:49:03 PM
5/3/2013 3:49:03 PM
5/3/2013 2:06:12 PM
5/3/2013 11:19:34 AM
5/3/2013 11:03:32 AM
5/3/2013 1:58:38 PM
5/2/2013 7:27:55 PM
5/2/2013 7:17:50 PM
5/2/2013 7:06:06 PM
5/2/2013 6:42:37 PM
5/2/2013 6:30:58 PM
5/13/2013 12:49:24 PM

这是我的代码。

 DataTable dt;  
 DataView dv = dt.DefaultView;
 dv.Sort = "MessageDate desc";
 DataTable sortedDT = dv.ToTable();
 foreach (DataRow row in sortedDT.Rows)
 {
 code to print.
 }

正如您所看到的,2013年5月13日的最后日期应该是第一个而不是最后一个日期 5/13&gt; 5/9如果是日期比较,但如果你把它作为一个字符串,则为5/13 <5/9。

MessageDate Column是我声明中的日期时间,编译器仍在将其转换为String。

 public struct Messages
    {
        public string ProfileId { get; set; }
        public string Network { get; set; }
        public string FromId { get; set; }
        public string FromName { get; set; }
        public string FromProfileUrl { get; set; }
        public DateTime MessageDate { get; set; }
        public string Message { get; set; }
        public string FbComment { get; set; }
        public string FbLike { get; set; }
        public string MessageId { get; set; }
        public string Type { get; set; }

    }

为什么会发生这种情况以及如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

您需要实施IComparableDateTime排序: http://forums.asp.net/p/1267353/2393006.aspx

或者,如果您可以更改结构,则可以添加排序值:

public string SortValue
{
    get
    {
        return ((int)((MessageDate - new DateTime(1970, 1, 1)).TotalSeconds)).ToString("D12");
    }
}

将MessageDate转换为second-since-epoch值,然后按字典顺序对其进行排序。

答案 1 :(得分:1)

DataView将日期或任何内容存储为字符串类型。因此,当您排序时,它按字符串排序。要将其排序为DateTime,您需要在添加任何数据之前将列转换为DateTime,如下所示,

dt.Columns [“Date”]。DataType = Type.GetType(“System.DateTime”);