2013-09-26 3 views
0

У меня есть компонент DataGridView, заполненный SortableBindingList, как указано в SDK SQL Server, Microsoft.SqlServer.Management.Controls. Этот класс также используется как корневой узел для сериализации XML.C# SortableBindingList не может сортировать столбцы с значениями Object

Элементы списка имеют тип с двумя примитивными полями и одно поле объекта. Столбцы, содержащие примитивные значения, сортируются так, как они ожидали бы. Однако, при сортировке столбца, содержащего поля объекта, следующее исключение:

System.InvalidOperationException was unhandled 
    Message=Failed to compare two elements in the array. 
    Source=mscorlib 
    StackTrace: 
     at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer) 
     at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer) 
     at System.Collections.Generic.List`1.Sort(Comparison`1 comparison) 
     at Microsoft.SqlServer.Management.Controls.SortableBindingList`1.ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) 
     at System.ComponentModel.BindingList`1.System.ComponentModel.IBindingList.ApplySort(PropertyDescriptor prop, ListSortDirection direction) 
     at System.Windows.Forms.BindingSource.ApplySort(PropertyDescriptor property, ListSortDirection sort) 
     ... 
    InnerException: System.ArgumentException 
     Message=At least one object must implement IComparable. 
     Source=mscorlib 
     StackTrace: 
      at System.Collections.Comparer.Compare(Object a, Object b) 
      at Microsoft.SqlServer.Management.Controls.SortableBindingList`1.<>c__DisplayClass1.<GetComparisionDelegate>b__0(T t1, T t2) 
      at System.Array.FunctorComparer`1.Compare(T x, T y) 
      at System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b) 
      at System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer) 
      at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer) 

кажется довольно ясно из трассировки стека, что объекты, которые сравниваются не IComparable - за исключением того, что они есть. Или, по крайней мере, они должны быть. Класс в вопросе заключается в следующем:

using System; 
using System.Xml.Serialization; 

namespace myapp.xmlobjects { 
    [XmlType("error_after")] 
    public class ErrorAfterObject : IComparable<ErrorAfterObject> { 

     [XmlAttribute("hours")] 
     public int Hours { get; set; } 

     [XmlAttribute("minutes")] 
     public int Minutes { get; set; } 

     public ErrorAfterObject() { } 

     public ErrorAfterObject(int hours, int minutes) { 
      this.Hours = hours; 
      this.Minutes = minutes; 
     } 

     public override string ToString() { 
      return string.Format("{0} hr {1} min", this.Hours, this.Minutes); 
     } 

     public int CompareTo(ErrorAfterObject other) { 
      return (this.Hours*60 + this.Minutes).CompareTo(other.Hours*60 + other.Minutes); 
     } 
    } 
} 

В качестве проверки вменяемости, я добавил следующий код отладки после связывания данных:

Console.WriteLine(myGridView.Rows[0].Cells[2].ValueType.ToString()); 

, который возвращается как myapp.xmlobjects.ErrorAfterObject, как я бы ожидать.

Три вопроса, которые могут помочь решить проблему: набираются ли мои объекты как нечто несравнимое? Можно ли точно проверить, какие типы объектов сравниваются? Я что-то пропустил в реализации IComparable?

Заранее спасибо.

ответ

2

Как оказалось, IComparable и IComparable<T> - это не одно и то же. Замена определение класса с:

public class ErrorAfterObject : IComparable 

и метод CompareTo с:

public int CompareTo(object other) { 
    if(this.GetType() != other.GetType()) { 
     return Comparer.Default.Compare(this, other); 
    } 
    return (this.Hours*60 + this.Minutes).CompareTo(
     ((ErrorAfterObject)other).Hours*60 + ((ErrorAfterObject)other).Minutes); 
} 

работает, как один ожидает.

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

  • Нет связанных вопросов^_^