Для блага других, вот решение, которое я придумала, но я бы хотела услышать лучшее.
Я добавил дополнительный непостоянный столбец в таблицу данных с именем SORT_ORDER, который используется только для сортировки.
Когда пользователь щелкает столбец для сортировки, я копирую значения и тип значения из выбранного столбца в столбец SORT_ORDER, а затем сортирую по SORT_ORDER. Поскольку SORT_ORDER не отображается и не может быть отредактирован, порядок сортировки не изменяется, даже если пользователь редактирует выбранный столбец. Обработчик события выглядит так:
private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
dirtyCellListenerEnabled = false;
SORT_ORDER.ValueType = MyDataGridView.Columns[e.ColumnIndex].ValueType;
foreach(DataGridViewRow r in MyDataGridView.Rows) {
r.Cells[SORT_ORDER.Index].Value = r.Cells[e.ColumnIndex].Value;
}
switch(MyDataGridView.SortOrder) {
case System.Windows.Forms.SortOrder.None:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
break;
case System.Windows.Forms.SortOrder.Ascending:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Descending);
break;
case System.Windows.Forms.SortOrder.Descending:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
break;
}
dirtyCellListenerEnabled = true;
}
Обратите внимание, что мне пришлось отключить и снова включить прослушиватель ячеек, чтобы мой код не воспринимал обновление столбца сортировки как реальное изменение.
Прежде чем прийти к этому решению, я также попытался добавить столбец сортировки в DataGridView, но он не работает, поскольку DataGridView не может отсортировать столбец, который не существует в его источнике данных.
Я уверен, что есть и другие настройки, такие как приостановка обновлений при заполнении SORT_ORDER и отображение символа сортировки в выбранном столбце.