2013-09-19 3 views
0

У меня есть DataTable DT1:Сортировка Datatable по количеству не по алфавиту

Name Amount 
---- ----- 
A  10 
B  15 
C  5 
D  22 
E  16 
F  30 
G  31 

В C# я хочу, чтобы отсортировать данные, основанные на низкой до высокой или Войти высокие, в зависимости от пользователя, выберите в раскрывающемся списке. Я использую эту функцию, но она всегда сортируется по алфавиту, как 10,15,16,22,30,31,5. Любой может рассказать мне, что я должен использовать для сортировки данных.

protected void ddlHotelAPISearchBoxSorting_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DataTable dt2 = new DataTable(); 
     dt2 = dt1; 

     DataView dv = new DataView(dt1); 

     if (ddlHotelAPISearchBoxSorting.SelectedValue == "Low_Price_First") 
     { 
      //dt2.DefaultView.Sort = "CalculatedPrice ASC"; 
      dv.Sort = "CalculatedPriceWithNoSymbol ASC"; 
     } 
     else if (ddlHotelAPISearchBoxSorting.SelectedValue == "High_Price_First") 
     { 
      dv.Sort = "CalculatedPriceWithNoSymbol DESC"; 
     } 
     else if (ddlHotelAPISearchBoxSorting.SelectedValue == "Best_Match") 
     { 
     } 
     DataList1.DataSource = dv.ToTable(); 
     DataList1.DataBind(); 
    } 
+0

Является ли ваш столбец 'CalculatedPriceWithNoSymbol' возвращенным как строка? –

ответ

0

dv.Sort является строка, которая содержит имя столбца, за которой следует "ASC" (по возрастанию) или "DESC" (по убыванию). Если в вашем примере "Amount" - это имя столбца, по которому вы хотите отсортировать данные, вы можете попробовать это dv.Sort = "Amount ASC"

+0

Я предполагаю, что это просто опечатка. Даже тогда ваш ответ не будет работать в случае, если сумма имеет строковый тип данных. –

0

Для вашего DataView вам нужен Custom Comparer. По умолчанию sort of DataView compare strings и для строк 16 предшествует 5.

Это, как вы можете сортировать по int стоимости CalculatedPriceWithNoSymbol в восходящем порядке:

DataTable dt2 = new DataTable(); 

// Create temporary list to sort rows by int value. 
List<DataRow> rows = new List<DataRow>(); 
foreach (DataRow row in table.Rows) 
{ 
    rows.Add(row);  
} 

// Sort list in ascending order 
rows.Sort(delegate(DataRow row1, DataRow row2) 
    { 
     return ((int)row1["CalculatedPriceWithNoSymbol"]) 
        .CompareTo(((int)row2["CalculatedPriceWithNoSymbol"])); 
    }); 

// Add sorted rows back to datatable. 
foreach (DataRow row in rows) 
{ 
    dt2.Rows.Add(row.ItemArray); 
} 

DataList1.DataSource = dt2; 
DataList1.DataBind(); 
0

Если вы Amount столбец является строкой, то он сопоставляет, как ни странно, в виде строки. Подумайте о преобразовании его в decimal или int: если вы сделаете это, он будет сопоставляться, как вы могли ожидать.

Смежные вопросы