2009-07-30 22 views
13

Ich bin auf DataTable.DefaultView.Sort verwirrt. Hier ist das Segment des Codes Ich mag es benutzen.DataTable.DefaultView.Sort sortiert nicht

actionLogDT.DefaultView.Sort = "StartDate"; 

foreach (CustomerService.ActionLogStartEndRow logRow in actionLogDT) 
{ 
    // code here 
} 

Die Proben ich gesehen hat, nicht die foreach-Schleife verwenden, und somit ist verwirrend mir, wie dies zu verarbeiten. Es sortiert nicht so, wie ich gedacht habe.

Ich sehe, dass .DefaultView eine Ansicht zurückgibt, und .Table gibt einen Kompilierungsfehler.

+0

was ist deine Frage/Verwirrung? Welchen Kompilierungsfehler bekommst du? – shahkalpesh

+1

Es wird nicht sortiert. –

+2

Beim Sortieren nach einer Datumsspalte muss diese Spalte in der DataTable als DateTime definiert sein. Andernfalls kann es als String behandelt und in einer unerwarteten Reihenfolge sortiert werden. – DOK

Antwort

7

Ich hatte einen etwas anderen Ansatz. This post war der nächste, den ich finden konnte, um meinen Code zum Laufen zu bringen. Hier ist das Arbeitsergebnis:

actionLogDT.DefaultView.Sort = "StartDate"; 
DataView dv = actionLogDT.DefaultView; 

foreach (DataRowView logRow in dv) { . . . } 

Von dort muss ich nur den Wert in seinen richtigen Typ zurückwerfen.

(string)logRow["Status"].ToString() 
+0

Cast ist redundant ... '.ToString()' sollte ausreichen. – vapcguy

10

Das Sortieren der Ansicht ändert nicht die Sortierreihenfolge der Daten in der Tabelle, sondern nur die Reihenfolge in der Ansicht. Es sollte funktionieren, wenn Sie Ihre foreach stattdessen auf der Ansicht ausführen und die Zeile aus der DataRowView zurück in Ihre stark typisierte Zeile umwandeln.

foreach (DataRowView logRowView in actionLogDT.DefaultView) 
{ 
    CustomerService.ActionLogStartEndRow logRow = logRowView.Row as CustomerService.ActionLogStartEndRow; 
    // code here 
} 
+0

Doing das gibt mir eine "Kann nicht Objekt vom Typ" System.Data.DataRowView "um" ActionLogStartEndRow "eingeben." Error. –

+0

Wird 'ActionLogStartEndRow' von DataRow abgeleitet? –

+0

@ Jeromie - Ich bin mir sicher, dass es so ist. Ich verwende die .XSD-Datenschicht, um all dies zu erreichen. –

3
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... } 
0

Einfach nur neugierig: Warum verwenden Sie die DataRowView?

dh

foreach (DataRow row in actionLogDT.Rows) 
{ 
    Console.WriteLine(row["Status"]); 
} 
+1

Ich verstehe deine Frage nicht. –

+1

Weil die Frage war, eine Datentabelle zu sortieren. Um die sortierten Daten aufzuzählen, müssen Sie die Ansicht aufzählen, nicht die Tabelle selbst. –

1

Bitte versuchen Sie dies:

actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc"; 
+0

Ich werde das nächste Mal versuchen, dieses Problem zu haben. –

22
actionLogDT.DefaultView.Sort = "StartDate"; 

actionLogDT = actionLogDT.DefaultView.ToTable(); 
+1

Danke! Genau das, was ich brauchte.Holen Sie sich einen Tisch, sortieren Sie ihn und verwenden Sie ihn, während er auf eine bestimmte Art sortiert ist. – Lukas

+0

Etwas anderes Szenario/Symptome für mich, aber die .toTable() löste dies für mich. Vielen Dank. In meinem Fall habe ich den DefaultView.Sort-Ausdruck gut angewendet und sah, dass die Sortierung für DropDownList wirksam wird, aber für ein DataGrid wurde sie nicht wirksam. YMMV: Das DataGrid, auf das wir dies anwenden, ist eine sehr einfache schreibgeschützte Tabelle, die keine dynamische Sortierung usw. bietet. – storsoc

0

Wenn Sie eine Datatable zurück, dann müssen Sie etwas tun können:

var dv = actionLogDT.DefaultView; 
dv.Sort = "StartDate"; 

actionLogDT = dv.ToTable(); 
3

Zusätzlich Da es schien, als wolltest du durchschleifen Aufzeichnungen, können Sie einfach durchlaufen die dataRowView Objekte in der DefaultView.

foreach (DataRowView drv in table.DefaultView) 
{ 
    string strValue = drv["ColumnName"].ToString(); 
    // its also worth mentioning that a DataRowView has a Row 
    strValue = drv.Row["ColumnName"].ToString(); 
}