2017-03-20 53 views
0

我在我的數據庫中的一個表中有一個名爲price的字段,其類型爲varchar。在我的窗口中,我有一個listview和一個gridview在它綁定到該表。我已經設置了GridViewColumnHeader_Click事件gridview的如下:數據表排序行爲(雙值不被視爲數字)

private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) 
{ 
    datatable.DefaultView.Sort = "price ASC"; 
    datatable.DefaultView.ToTable(); 
} 

它排序價格列,但它把價格值string S,所以它的排序爲價格string S,而不是數字。此行爲是預期的,因爲價格字段的類型是varchar。爲了解決這個問題,我轉換價格進入double如下:

<GridViewColumn Header="price" DisplayMemberBinding="{Binding price, Converter={StaticResource convert1}}" /> 

和:

public class dataConvert1 : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return double.Parse(value.ToString()); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return new object(); } 
} 

但這並沒有解決問題,價格仍視爲string不是double秒。 這個問題可能看起來是重複的。但是,沒有人回答相同的問題(這裏或其他網站),這個問題仍然是一個問題。請幫助解決這個問題。 (請不要建議從varcharint改變字段價格型)

回答

1

使用視圖中的轉換器不會影響DataTableDataView如何被分類...轉換器只是一個UI格式化的東西,所以這是行不通的。

你應該真的改變列的類型。或者你可以添加另一列到DataTable並按此排序。事情是這樣的:

private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) 
{ 
    if (!datatable.Columns.Contains("price2")) 
    { 
     datatable.Columns.Add(new DataColumn("price2") { DataType = typeof(double) }); 
     foreach (DataRow dr in datatable.Rows) 
     { 
      dr["price2"] = Convert.ToDouble(dr["price"]); 
     } 
    } 
    datatable.DefaultView.Sort = "price2 ASC"; 
    datatable.DefaultView.ToTable(); 
} 

或者你可以簡單地用適當的列類型創建DataTable的副本,並用這個代替原來的DataTable

Sort string items in a datatable as int using c#

+0

這就是答案題。幾分鐘前我找到了這個解決方案,我想寫出答案,但幸運的是,您已經完成了任務,謝謝@ mm8。 – Masoud