У меня есть DataGridView, связанный с BindingSource, который, в свою очередь, связан с пользовательской реализацией IBindingList, которая обеспечивает сортировку.Мои столбцы DataGridView настроены для поддержки автоматической сортировки.Я ожидаю, что при первом нажатии на заголовок столбца список будет отсортирован по соответствующему столбцу (в соответствии с моей логикой ApplySortCore) в восходящем направлении, и появится значок направления сортировки, указывающий восходящее направление.Я ожидаю, что второй щелчок приведет к поиску по убыванию и переключению значка направления, отражающему новое направление.
Что происходит, когда при первом щелчке по столбцу список сортируется по возрастаниюнаправление на этот столбец, но значок направления сортировки не отображается.Во второй раз, когда я щелкаю заголовок столбца, снова запрашивается сортировка по возрастанию (подтверждается точкой останова в ApplySortCore), и в заголовке столбца появляется значок направления сортировки по возрастанию.В третий раз, когда я щелкаю заголовок столбца, запрашивается сортировка по убыванию, но в заголовке столбца по-прежнему отображается значок сортировки по возрастанию.В четвертый раз, когда я нажимаю, запрашивается другая сортировка по убыванию и появляется значок сортировки по убыванию.Цикл продолжается таким образом, что фактическое направление сортировки меняет каждый второй щелчок, а значок направления сортировки задерживает фактическое изменение направления сортировки на один щелчок.
Похоже, что DataGridView (или BindingSource) неправильно отслеживаетнаправление сортировки и, следовательно, неправильно запрашивает сортировку метода IBindingList ApplySortCore.
Используемая мной реализация IBindingList происходит от этого абстрактного класса:
internal abstract class CustomSortableBindingList<T> : BindingList<T>
{
private bool m_isSorted;
private ListSortDirection m_sortDirection;
private PropertyDescriptor m_sortProperty;
private IComparer<T> m_currentComparer;
protected CustomSortableBindingList()
{
}
protected CustomSortableBindingList(IList<T> items)
: base(items)
{
}
protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
var comparer = GetComparer(property, direction);
Sort(comparer);
m_sortDirection = direction;
m_sortProperty = property;
CurrentComparer = comparer;
}
protected abstract IComparer<T> GetComparer(PropertyDescriptor property, ListSortDirection direction);
protected override void RemoveSortCore()
{
m_isSorted = false;
}
protected override bool SupportsSortingCore
{
get { return true; }
}
protected override bool IsSortedCore
{
get { return m_isSorted; }
}
protected override ListSortDirection SortDirectionCore
{
get { return m_sortDirection; }
}
protected override PropertyDescriptor SortPropertyCore
{
get { return m_sortProperty; }
}
public IComparer<T> CurrentComparer
{
get { return m_currentComparer; }
set { m_currentComparer = value; }
}
public void Sort(IComparer<T> comparer)
{
var items = Items as List<T>;
if ((null != items) && (null != comparer))
{
items.Sort(comparer);
m_isSorted = true;
CurrentComparer = comparer;
}
else
{
m_isSorted = false;
}
// Let bound controls know they should refresh their views
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
Метод GetComparer ()Конкретный класс просто содержит оператор switch, основанный на имени, указанном в дескрипторе свойства, и возвращает правильный IComparer:
protected override IComparer<HostListItem> GetComparer(PropertyDescriptor property, ListSortDirection direction)
{
switch (property.Name)
{
case "SomeProperty":
return new SomePropertyComparer(direction, CurrentComparer);
default:
return null;
}
}
Свойство CurrentComparer используется для поддержки вложенной сортировки.
I 'мы пытались связать DataGridView напрямую с IBindingList (исключая BindingSource, поскольку кажется, что он действительно не предоставляет каких-либо дополнительных функций), но ничего не меняется.
Кто-нибудь знает, почему DataGridViewКажется, не удается отобразить правильные значки направления сортировки или предоставить правильное направление сортировки для вызовов сортировки?