2013-05-14 14 views
6

Ich versuche, eine DataView in C# zu sortieren. Es scheint, dass die Sort-Methode der DataView-Klasse die Daten als Zeichenfolgen verwendet.Problem beim Sortieren einer Datumsspalte in DataTable/DataView in C#

In der Ausgabe dieses bin immer -

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 

Dies ist mein Code.

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

Wie können Sie die letzte Datum siehe 2013.05.13 am ersten sein sollte und nicht am Boden als 13.05> 09.05 wenn sie ein Datumsvergleich, aber 5/13 < 5/9 wenn du es als eine Schnur nimmst.

MessageDate Spalte ist datetime in meiner Deklaration, noch konvertiert der Compiler es in 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; } 

    } 

Irgendwelche Ideen, warum das passiert und wie ich das gleiche umgehen kann?

Antwort

1

Sie müssen IComparable implementieren, indem DateTime sortieren: http://forums.asp.net/p/1267353/2393006.aspx

Alternativ, wenn Sie die Struktur ändern können, können Sie einen Sortierwert hinzufügen:

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

die die MessageDate zu Blicke konvertiert -Since-Epoch-Wert, und dann kann es lexikographisch sortiert werden.

1

DataView speichert das Datum oder irgendetwas als Zeichenfolge. Wenn Sie also sortieren, wird nach String sortiert. Um es als DateTime zu sortieren, müssen Sie die Spalte vor dem Hinzufügen von Daten in DateTime konvertieren, wie folgt:

dt.Columns ["Datum"]. DataType = Type.GetType ("System.DateTime");

Verwandte Themen