IComparable требуется для сортировки столбца

Один из столбцов в моей DevExpress xtragrid не сортируется, не группируется и не фильтруется. Ответы на подобные вопросы предполагают, что мне нужно реализовать IComparable, но когда я это сделал, он вообще больше не отображается в столбце.

public class Flow : System.IComparable<Flow>
{
  public Flow(int id, string name, string description)
  {
    this.ID = id;
    this.Name = name;
    this.Description = description;
  }

  public int ID { get; private set; }

  public string Name { get; private set; }

  public string Description { get; private set; }

  public override string ToString()
  {
    return Name;
  }

  public override bool Equals(object obj)
  {
    Flow flow = obj as Flow;
    if (flow == null) return false;
    return this.ID == flow.ID;
  }

  public static bool operator ==(Flow flow1, Flow flow2)
  {
    if (object.ReferenceEquals(null, flow1))
      return object.ReferenceEquals(null, flow2);
    return flow1.Equals(flow2);
  }

  public static bool operator !=(Flow flow1, Flow flow2)
  {
    return !(flow1 == flow2);
  }

  public override int GetHashCode()
  {
    return ID;
  }

  public int CompareTo(Flow other)
  {
    return this.Name.CompareTo(other.Name);
  }
}

Что я сделал не так?

ОБНОВЛЕНИЕ:

На вопрос DevExpress...


person Michael Sandler    schedule 25.01.2013    source источник
comment
Я считаю, что для сортировки вам понадобится IComparer, а не IComparable. Подробности см. в ответе SO: stackoverflow.com/ вопросы/538096/. IComparable просто сообщит вам, равно или нет, но реализация IComparer сообщит вам больше, равно и меньше, тем самым позволяя вам сортировать.   -  person Ravi Y    schedule 25.01.2013
comment
@ryadavilli: это должно быть IComparable как при внутреннем сравнении.   -  person Dave New    schedule 25.01.2013
comment
@davenewza Я не уверен насчет сетки данных, но в целом для сортировки вам нужно знать больше или меньше или равно. Простой CompareTo, который просто указывает, равно или не равно, не поможет отсортировать данные. Можете ли вы указать мне какую-нибудь документацию, которая поможет мне понять это?   -  person Ravi Y    schedule 25.01.2013
comment
Лучше всего задать этот вопрос на форумах DevExpress. XtraGrid такой ужасно спроектированный элемент управления. Вероятно, вам также необходимо установить различные свойства.   -  person Dave New    schedule 25.01.2013
comment
@ryadavilli: IComparable на MSDN. IComparable определенно указывает больше, равно или меньше. Это интерфейс де-факто, используемый для сравнения объектов.   -  person Dave New    schedule 25.01.2013
comment
@davenewza Аааа, да, это так. Спасибо, что указали мне на это.   -  person Ravi Y    schedule 25.01.2013


Ответы (2)


Исчезающий контент был не связанной с этим проблемой — отвлекающим маневром. Столбец разрешил сортировку после того, как я реализовал IComparable, а не IComparable<Flow>

public int CompareTo(object obj)
{
  if (object.ReferenceEquals(null, obj))
    return 1;
  Flow flow = obj as Flow;
  if (flow == null)
    throw new ArgumentException("Object is not of type Flow");
  return this.Name.CompareTo(flow.Name);
}

Источник из документации MSDN для IComparable.CompareTo Method

person Michael Sandler    schedule 25.01.2013

Похоже, ваш метод CompareTo неверен. Попробуйте добавить следующее в метод CompareTo() и посмотрите, работает ли он:

    public int CompareTo(Flow other)
    {
      // Alphabetic sort if name is equal.
      if this.Name == other.Name
      {
        return this.Name.CompareTo(other.Name);
      }
     //Default sort.
     return other.Name.CompareTo(this.Name);
    }

Дайте мне знать, если это решило вашу проблему.

person Community    schedule 25.01.2013
comment
Спасибо Йохан, но это не меняет поведение столбца. - person Michael Sandler; 25.01.2013
comment
Удовольствие, Майкл, я просто хочу узнать, может быть, вы добавляете свои ценности в список? Если нет, попробуйте создать список объектов потока, например: List‹Flow› list = new List‹Flow›(); и после добавления всех объектов в список попробуйте использовать list.Sort(); чтобы попытаться отсортировать список, а затем попытаться заполнить сетку данными - person ; 25.01.2013
comment
Я пытался использовать встроенную функциональность devexpress xtragrid. Теперь это работает; см. мой ответ. - person Michael Sandler; 25.01.2013