Как выяснить, какое состояние выбранных элементов было изменено в DataGridView? - PullRequest
1 голос
/ 04 декабря 2009

У меня есть DataGridView с включенным MultiSelect. Когда происходит событие SelectionChanged, я хотел бы знать, какие элементы были недавно выбраны, а какие были отменены. Например, если у вас выбрано несколько элементов (по нажатию Ctrl), а затем вы отпускаете клавишу Ctrl и выбираете один элемент, я хотел бы знать, какие элементы были отменены. Я мог отслеживать предыдущую коллекцию выбранных предметов, но я просто хотел убедиться, что я не думал слишком усердно.

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Событие не говорит вам, что именно изменилось. Если вам по какой-то причине необходимо знать, вам придется отслеживать предыдущий выбор.

Что вы пытаетесь сделать в ответ на это событие? Там может быть гораздо более простой способ достичь вашей реальной цели.

1 голос
/ 04 декабря 2009

Эта информация должна быть в аргументах события.

Используйте событие RowStateChanged. DataGridViewRowStateChangedEventArgs будет содержать строку, по которой щелкнули. Если пользователь выбирает / отменяет выбор нескольких строк, событие будет вызываться один раз для каждой выбранной / отмененной строки.

e.Row.Selected определит, будет ли строка выделена или отменена.

0 голосов
/ 04 декабря 2009

Эта информация недоступна для DataGridView. Однако вы можете написать обертку вокруг DataGridView, которая предоставляет эту информацию.

public static void OnSelectionChanged(
  this DataGridView view,
  Action<List<DataGridViewRow>,List<DataGridViewRow>> handler) {
  var oldSelection = view.SelecetedRows.Cast<DataGridViewRow>.ToList();
  view.SelectedChanged += (sender,e)  {
    var newSelection = view.SelectedRows.Cast<DataGridViewRow>.ToList();
    handler(oldSelection,newSelection);
    oldSelection = newSelection;
  };
}

Вариант использования

void HandleSelectionChanged(List<DataGridViewRow> oldRows, List<DataGridViewRow> newRows) {
  ..
}

void FormLoaded() {
  myDataGridView.OnSelectionChanged(HandleSelectionChanged);
}
...