Ответ 1
Вы можете обойти это поведение, сохранив значение текущей выбранной строки (или строк) перед сортировкой, а затем повторно выбрав строку впоследствии.
Вам нужно использовать событие CellMouseDown - необходимо использовать это событие, поскольку оно является единственным, которое срабатывает до того, как произойдет сортировка. Альтернативные события, такие как ColumnHeaderMouseClick, слишком поздно.
В обработчике событий CellMouseDown проверьте, что индекс строки равен -1, чтобы гарантировать, что заголовки были выбраны.
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1)
{
selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
}
}
У меня есть поле уровня класса selected
, которое я использую для хранения уникального идентификатора выбранного столбца. Если у вас нет уникального идентификатора, вы можете добавить в колонку для этой цели и скрыть его.
Затем в обработчике событий Sorted
DataGridView вы можете использовать метод .Find() источника привязки сетки:
void dataGridView1_Sorted(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(selected))
{
int itemFound = _bindingSource.Find("name", selected);
_bindingSource.Position = itemFound;
}
}
При этом я обнаружил следующее сообщение на форумах MSDN, где ответ использует событие DataBindingComplete - я не 100%, почему они что это необходимо, поскольку мой подход работал на все мои тесты, но вы можете найти его полезной ссылкой.