2015-03-02 52 views
0

我有,其中有四列按如下數據表: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

回答

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改變界線本:

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

0

,我會告訴你不同的(正確的,我認爲)的方式來這一點。 首先,讓我們創建一個類爲這樣的數據:現在

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 - 將數據填充到像我向你展示的列表中(可能只是一些重構代碼)。 我希望它會有所幫助。