2011-11-30 23 views
5

Mam tabeli dwie kolumny zawierającej CustomerName i wiek kolumn. Mam wszystkie dane w DataTable. Chcę posortować go według malejącego wieku, a następnie każda grupa wiekowa jest sortowana według nazwy. Więc wszystkie osoby w wieku 30 zostaną posortowane alpabetically i być pomiędzy listami osób w wieku 29 i 31 itd.C# sortowania tabeli przez 2 kolumny

mam:

string selectStatement = "Age"; 
string sortStatement = "Age DESC" 

var rows = table.Select(selectStatement, sortStatement); 

ten powinien sortować według wieku. Nie wiem, jak sortować alfabetycznie każdą grupę wiekową, ale powyższy wyjątek stanowi:

Wyrażenie filtru "Wiek" nie jest wartością logiczną.

Odpowiedz

3

Jak @adrift powiedział. Powinieneś wysłać wyrażenie filtru (które zwraca wartość logiczną) jako pierwszy argument. Spróbuj wysłać puste i puste ciągi, być może opcja Select zignoruje argument. Lub nadaj mu trywialne wyrażenie, takie jak 0 < 1. Następnie, w kolejności po części, możesz oddzielić kilka pól przecinkami: "Age Desc, Name".

Ale nawet lepiej, należy użyć klasy DataView. Tak:

var dt = new DataTable(); // your data. 
var view = new DataView(dt); 
view.Sort = "Age desc, Name asc"; 

Następnie można ustawić tej klasy jako źródło danych dla niektórych kontroli, itd. Będzie to powrót wiersze w odpowiedniej kolejności. Albo można po prostu użyć foreach iteracyjne nad rzędami.

foreach (DataRowView dr in view) 
{ 
    //do what you like 
} 
1

Pierwszy argument dla Select powinien być wyrażeniem filtru, a nie listą kolumn do wyboru.

0

To dlatego, że metoda DataTable.Select jest do filtrowania a SELECT nie jest jak SQL Select.

Spróbuj tego:

table.DefaultView.Sort = "Age DESC"; 
0

Twój SelectStatement musi zawierać wyraz filtra. Spójrz na this.

Więc twój selectExpression może być

string selectStatement = "Age > 0"; //if all people required 
1

Wybór i sortowanie to dwie różne rzeczy.

Można użyć linq to dataset:

var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")). 
           ThenBy(row => row.Field<string>("Name")); 
0

arg filtr mogą być przekazywane jako wartość null tak nie wypełnienia filtr zastosować, oraz w rodzaju można umieścić dowolną liczbę kolumn, które chcesz z/bez określając kierunek sortowania (domyślnie jest asc). Z mojego doświadczenia, na dużej DataTables Wybierz idzie szybciej niż podejście LINQ.

0

DataView oDataSet; oDataSet.Tables [0] .DefaultView.Sort = "Column1 ASC";

Powiązane problemy