2015-03-02 4 views
0

У меня есть таблица данных, в которой имеется четыре колонны, как на ниже:DataTable.DefaultView.Sort не сортировать должным образом, когда сортировать по DateTime Колонка

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

+3

'Quarters = Quarters.DefaultView.ToTable()' Использовать это после 'Quarters. DefaultView.Sort = "StartDate"; ' – CodingDefined

+0

Hello @CodingDefined работает нормально. Вы можете добавить его в качестве ответа, чтобы я мог отметить его как правильный. Большое спасибо. –

ответ

1

Вы правы. Iget запутался в другой проблеме.

сделать это сотрудники Создайте новый класс, который реализует 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

+0

@MajkeloDev Взгляните на мое обновление –

+0

Я не пробовал, но этот выглядит хорошо. upv – MajkeloDev

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 - заполнять ваши данные в списке, например, я показал вам (возможно, всего лишь немного кода рефакторинга). Надеюсь, это поможет.