Сделал быстрый веб-поиск, чтобы выяснить, как сделать выбор из таблицы данных невыбираемым, и получил эту (веб-страницу) хит.
Вызов ClearSelection для SelectionChanged может и вызывает двойное срабатывание события SelectionChanged, как минимум.
Первое событие - это когда ячейка / строка выбрана и, конечно же, событие SelectionChanged сработало.
Второе срабатывание - это когда ClearSelection вызывается так, как это вызывает (и логически так!) Выбор представления сетки данных, чтобы (снова) изменить (без выбора), тем самым запустив SelectionChanged.
Если у вас больше кода, чем просто ClearSelection, как я, вы захотите подавить это событие до тех пор, пока ваш код не будет завершен. Вот пример:
private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
//suppresss the SelectionChanged event
this.dgvMyControl.SelectionChanged -= dgvMyControl_SelectionChanged;
//grab the selectedIndex, if needed, for use in your custom code
// do your custom code here
// finally, clear the selection & resume (reenable) the SelectionChanged event
this.dgvMyControl.ClearSelection();
this.dgvMyControl.SelectionChanged += dgvMyControl_SelectionChanged;
}