DataTable.DefaultView.Sort不正确排序时,排序时间列

DataTable.DefaultView.Sort不正确排序时,排序时间列

问题描述:

我有,其中有四列按如下数据表:DataTable.DefaultView.Sort不正确排序时,排序时间列

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

我应该做的就是记录正确排序?

+0

有许多选项 - 如果你在开始时进行这种排序 - 我建议在填充你的数据网格或其它任何东西之前对你的集合进行排序 – MajkeloDev 2015-03-02 11:32:57

+3

'Quarters = Quarters.DefaultView.ToTable()'在Quarters之后使用这个。 DefaultView.Sort =“StartDate”;' – CodingDefined 2015-03-02 11:39:32

+0

Hello @CodingDefined它工作正常。你可以添加它作为答案,以便我可以标记为正确的。非常感谢。 – 2015-03-02 11:56:27

你说得对。我被另一个问题弄糊涂了。

做这个工作人员创建一个新类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改变界线本:

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

您确定吗?如果它将被视为一个DateTime然后DataGrid会正确排序,文化并不重要,我认为DataGrid解析这个DateTime字符串,这就是导致问题的原因。我认为从这个DataTable创建集合并将其排序在这个集合中会更好。它会有额外的优势 - 绑定功能 – MajkeloDev 2015-03-02 11:46:20

+0

@MajkeloDev看看我的更新 – 2015-03-02 12:06:13

+0

我没有试过,但这个看起来不错。 upv – MajkeloDev 2015-03-02 12:13:08

,我会告诉你不同的(正确的,我认为)的方式来这一点。 首先,让我们创建一个类为这样的数据:现在

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

,在你的类,这是resposible对这些数据进行工作 - 让我们来处理这个问题。

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

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的情况下执行此操作。而不是模仿DataTable - 将数据填充到像我向你展示的列表中(可能只是一些重构代码)。 我希望它会有所帮助。