У меня есть настраиваемый столбец DataGridView, в котором используется встроенный элемент управления, который открывает окно поиска для значения этого столбца. Важно то, что столбец привязки данных имеет числовой идентификатор, а в ячейках настраиваемого столбца отображается текстовое описание.
Как мне настроить сортировку столбца по текстовому описанию, а не по числовому идентификатору?
Я не вижу способа переопределить столбец для сортировки по FormattedValue вместо Value. Я мог бы убедиться, что описание отображается как отдельный столбец в моей таблице данных, но я не вижу способа сказать «используйте столбец VALUE_ID как DataMember, а столбец VALUE_DESCRIPITON как 'SortMember'»





Что вы используете в качестве источника данных? DataTable? Сортировка чаще всего обеспечивается самим списком, поэтому вы можете написать собственный список со своим собственным определенным поведением сортировки. Самый простой подход (хотя все еще нетривиальный) - унаследовать от BindingList<T> и переопределить ApplySortCore, RemoveSortCore, SupportsSortingCore, IsSortedCore, SortPropertyCore и SortDirectionCore (уф!). В частности, ApplySortCore должен будет обнаружить конкретный PropertyDescriptor и выполнить индивидуальный поиск.
Я не говорю, что это тривиально (как раз наоборот), но это можно сделать с помощью стандартных механизмов привязки.
Альтернативная идея может заключаться в том, чтобы сделать идентификатор чем-то еще, что на самом деле не является int, а является настраиваемым классом / структурой. Потребуется реализовать IComparable / IComparable<T> и иметь ToString(), отображающий желаемый текст. Тогда вы могли бы предположительно (непроверенно) привязаться непосредственно к этому столбцу.
Тем не мение!!! Если вы еще не знакомы с System.ComponentModel, я бы посоветовал избежать этой сложности. Если вышесказанное имеет смысл, тогда хорошо - если нет, я не уверен, что попробую это для вашего первого удара в эту область ...
Вы можете использовать технику, описанную в следующей статье Режимы сортировки столбцов
private bool ascending;
private int sortColumn;
private void dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
List<SomeObject> list = (List<SomeObject>)someBindingSource.DataSource;
if (e.ColumnIndex != sortColumn) ascending = false;
int 1 = e.ColumnIndex;
if (i == DescriptionColumn.Index)
list.Sort(new Comparison<SomeObject>((x,y) => x.ID.CompareTo(y.ID)));
sortColumn = e.ColumnIndex;
ascending = !ascending;
if (!ascending) list.Reverse():
someBindingSource.ResetBindings(false);
// you may also have to call dgv.Invalidate();
}
Таблица данных, похоже, не может быть преобразована в List <>
Хотя в этот момент я мог бы просто установить сортировку непосредственно в источнике привязки - мне придется попробовать это.
Определенно нетривиально! Но похоже, что нет более быстрого способа сделать это.