Раньше таблицы не всегда использовались для прямой привязки DataGridView, и не было проблем с невозможностью сортировки. Когда я впервые попробовал List, я обнаружил, что функция сортировки не может быть реализована, несмотря ни на что.
Каждый столбец DataGridView имеет сортировку. По умолчанию установлено значение «Автоматически». Я изменил его на NotSortable. Независимо от результата, он все равно не работает.
Некоторые друзья сказали, что вы можете перетащить элемент управленияbindingsource.datasource=generic Collection datagridview.datasource=bindingsource;
Я обнаружил, что это тоже не работает, так что мне делать? Узнайте после проверки информации
Использование дженериков приведет к потере характеристик DateTable. Для сортировки необходимо реализовать System.Collections.Generic.IComparer<T>.
Нет другого пути, кроме как осознать это.
Взгляните на код ниже, в основном он выглядит так
код
использование системы;
использование System.ComponentModel;
использование System.Collections.Generic;
использование System.Reflection;
пространство имен BaseFunction
{
класс ObjectPropertyCompare<T>: System.Collections.Generic.IComparer<T>
{
частное свойство PropertyDescriptor;
частное направление ListSortDirection;
public ObjectPropertyCompare (свойство PropertyDescriptor, направление ListSortDirection)
{
this.property = свойство;
this.direction = направление;
}
#region IComparer<T>
/// <сводка>
/// Метод сравнения
/// </сводка>
/// <param name="x">Относительный атрибут x</param>
/// <param name="y">Относительный атрибут y</param>
/// <возвращается></возвращается>
public int Compare(T x, T y)
{
объект xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
объект yValue = y.GetType().GetProperty(property.Name).GetValue(y, null);
интервал возврата значения;
если (xValue — IComparable)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
иначе, если (xValue.Equals(yValue))
{
возвращаемое значение = 0;
}
еще
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
если (направление == ListSortDirection.Ascending)
{
вернуть returnValue;
}
еще
{
вернуть returnValue * -1;
}
}
public bool Equals(T xWord, T yWord)
{
вернуть xWord.Equals(yWord);
}
public int GetHashCode (T obj)
{
вернуть obj.GetHashCode();
}
#конечныйрегион
}
}
После реализации этого интерфейса не нужно спешить. Нам нужно написать класс SortableBindingList <T> :BindingList <T> для привязки данных.
Базовая реализация
код
использование системы;
использование System.ComponentModel;
использование System.Collections.Generic;
использование System.IO;
использование System.Runtime.Serialization.Formatters.Binary;
использование System.Text;
пространство имен BaseFunction
{
открытый класс BindingCollection<T>: BindingList<T>
{
частный bool isSorted;
частный PropertyDescriptor sortProperty;
частный ListSortDirection sortDirection;
защищенное переопределение bool IsSortedCore
{
получить {вернуться isSorted};
}
защищенное переопределение bool SupportsSortingCore
{
получить {вернуть истину}
}
защищенное переопределение ListSortDirection SortDirectionCore
{
получить {возврат направления сортировки};
}
защищенное переопределение PropertyDescriptor SortPropertyCore
{
получить {возврат сортировки};
}
защищенное переопределение bool SupportsSearchingCore
{
получить {вернуть истину}
}
защищенное переопределение void ApplySortCore (свойство PropertyDescriptor, направление ListSortDirection)
{
List<T> items = this.Items as List<T>;
если (элементы != ноль)
{
ObjectPropertyCompare<T> pc = новый ObjectPropertyCompare<T>(свойство, направление);
предметы.Сортировать(ПК);
isSorted = правда;
}
еще
{
isSorted = ложь;
}
сортировкаСвойство = свойство;
sortDirection = направление;
this.OnListChanged(новый ListChangedEventArgs(ListChangedType.Reset, -1));
}
защищенное переопределение void RemoveSortCore()
{
isSorted = ложь;
this.OnListChanged(новый ListChangedEventArgs(ListChangedType.Reset, -1));
}
//Сортировка
public void Sort (свойство PropertyDescriptor, направление ListSortDirection)
{
this.ApplySortCore(свойство, направление);
}
}
}
Теперь пришло время разобраться, как его использовать. На самом деле это очень просто.
прямой
BindingCollection<объект> objList = новый BindingCollection<объект>();
objList = ваш набор результатов;
this.dataGridView1.DataSource = objList;
Но теперь проблема в том, что я раньше использовал List и не хочу его менять. Более того, вызывается Dll и возвращается List, у меня нет возможности изменить его на BindingCollection<object>.
Долго думая над этим, я наконец понял это, но не знаю, как оно с точки зрения производительности и других аспектов, поэтому выложу код и давайте его обсудим.
Вот как я этого добился
код
//Классы, которые могут реализовывать сортировку
BindingCollection<historyorderInfo> objList = new BindingCollection<historyorderInfo>();
//Загрузка данных
foreach (элемент историиorderInfo в tmpList)
{
objList.Add(пункт);
}
dgvhistory.DataSource = objList;
Здесь tmpList — это исходный список системы, которую я использовал ранее. Я использовал foreach для импорта исходных данных в BindingCollection.
Эта решимость может достичь желаемого эффекта. Я не знаю, что в этом плохого. Надеюсь, я смогу получить совет от эксперта, хаха