Jak naśladować zachowanie Eksploratora Windows przy wielokrotnym wyborze / przeciągnięciu i upuszczeniu w DataGridView?

Próbuję naśladować sposób, w jaki Eksplorator Windows obsługuje wielokrotny wybór. W domyślnym DataGridView możesz wybrać wiele elementów za pomocą kliknięcia Ctrl. Ale jeśli zwolnisz klawisz Ctrl, a następnie spróbujesz przeciągnąć / upuścić wybrane elementy, usunie zaznaczone elementy i wybierze tylko wiersz „hit”. Znalazłem następujące rozwiązanie gdzieś w Internecie.

protected override OnMouseDown(MouseEventArgs e)
{
  int hitRowIndex = HitTest(e.X, e.Y).RowIndex;
  if(!SelectedRows.Contains(Rows[hitRowIndex]))
  {
    base.OnMouseDown();
  }
}

Powoduje to jednak inne skutki uboczne. Po naciśnięciu klawisza CTRL i opuszczeniu wybranego elementu, element pozostaje zaznaczony. Ma to sens, ponieważ zdarzenie połączone jest pomijane, jeśli wybrany kliknięty wiersz jest zaznaczony. Patrząc na zachowanie Eksploratora Windows, wygląda na to, że odznaczenie elementu za pomocą przytrzymanego klawisza CTRL nie jest obsługiwane do momentu zdarzenia MouseUp. Czy ktoś próbował to zrobić?

questionAnswers(2)

yourAnswerToTheQuestion