2015-07-17 2 views
0

Я использую этот SortableBindingList в своем инструменте CSharp для сортировки элементов в DataGridView, и он отлично работает, за исключением десятичных чисел в виде строк, например. «125,03»!DataGridView SortableBindingList для десятичных чисел как строки

public class SortableBindingList<T> : BindingList<T> 
{ 
    private ArrayList sortedList; 
    private bool isSortedValue; 

    public SortableBindingList() 
    { 
    } 

    public SortableBindingList(IList<T> list) 
    { 
     foreach (object o in list) 
     { 
      this.Add((T)o); 
     } 
    } 

    protected override bool SupportsSortingCore 
    { 
     get { return true; } 
    } 


    protected override bool IsSortedCore 
    { 
     get { return isSortedValue; } 
    } 

    ListSortDirection sortDirectionValue; 
    PropertyDescriptor sortPropertyValue; 

    protected override void ApplySortCore(PropertyDescriptor prop, 
     ListSortDirection direction) 
    { 
     sortedList = new ArrayList(); 

     Type interfaceType = prop.PropertyType.GetInterface("IComparable"); 

     if (interfaceType == null && prop.PropertyType.IsValueType) 
     { 
      Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType); 

      if (underlyingType != null) 
      { 
       interfaceType = underlyingType.GetInterface("IComparable"); 
      } 
     } 

     if (interfaceType != null) 
     { 
      sortPropertyValue = prop; 
      sortDirectionValue = direction; 

      IEnumerable<T> query = base.Items; 
      if (direction == ListSortDirection.Ascending) 
      { 
       query = query.OrderBy(i => prop.GetValue(i)); 
      } 
      else 
      { 
       query = query.OrderByDescending(i => prop.GetValue(i)); 
      } 
      int newIndex = 0; 
      foreach (object item in query) 
      { 
       this.Items[newIndex] = (T)item; 
       newIndex++; 
      } 
      isSortedValue = true; 
      this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); 

     } 
     else 
     { 
      throw new NotSupportedException("Cannot sort by " + prop.Name + 
       ". This" + prop.PropertyType.ToString() + 
       " does not implement IComparable"); 
     } 
    } 

    protected override PropertyDescriptor SortPropertyCore 
    { 
     get { return sortPropertyValue; } 
    } 

    protected override ListSortDirection SortDirectionCore 
    { 
     get { return sortDirectionValue; } 
    } 

} 

Ссылка: DataGridView Using SortableBindingList

Какой адаптация необходима?

Thx за помощь!

ответ

0

Возможное решение:

decimal value; 
if (direction == ListSortDirection.Ascending) 
{ 
    // check if element count is not 0 and value is decimal 
    if (query.Count() > 0 && 
     decimal.TryParse(prop.GetValue(query.ElementAt<T>(0)).ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out value)) 
    { 
     // convert to decimal and sort 
     query = query.OrderBy(i => Convert.ToDecimal(prop.GetValue(i))); 
    } 
    else query = query.OrderBy(i => prop.GetValue(i)); 
} 
else 
{ 
    if (query.Count() > 0 && 
     decimal.TryParse(prop.GetValue(query.ElementAt<T>(0)).ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out value)) 
    { 
     query = query.OrderByDescending(i => Convert.ToDecimal(prop.GetValue(i))); 
    } 
    else query = query.OrderByDescending(i => prop.GetValue(i)); 
} 
Смежные вопросы