Вы можете обойти это поведение, сохранив значение текущей выбранной строки (или строк) перед сортировкой, а затем повторно выбрав строку впоследствии.
Вам необходимо использовать событие 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%, почему они сочли это необходимымтак как мой подход работал для всех моих тестов, но вы можете найти его полезным справочным материалом.