К быстро выберите все элементы в ListView
, посмотрите длинный ответ на на этот вопрос . Описанный здесь метод является практически мгновенным, даже для списков из 100 000 объектов И он работает с виртуальными списками.
ObjectListView предоставляет много таких полезных ярлыков.
Однако нет способа автоматически инвертировать выбор. Метод SLaks будет работать для обычных ListViews, но не для виртуальных списков, поскольку вы не можете перечислить коллекцию Items
в виртуальных списках.
В виртуальном списке лучшее, что вы можете сделать, это что-то, что вы впервые предложили: *
static public InvertSelection(ListView lv) {
// Build a hashset of the currently selected indicies
int[] selectedArray = new int[lv.SelectedIndices.Count];
lv.SelectedIndices.CopyTo(selectedArray, 0);
HashSet<int> selected = new HashSet<int>();
selected.AddRange(selectedArray);
// Reselect everything that wasn't selected before
lv.SelectedIndices.Clear();
for (int i=0; i<lv.VirtualListSize; i++) {
if (!selected.Contains(i))
lv.SelectedIndices.Add(i);
}
}
HashSet
- это .Net 3.5. Если у вас его нет, используйте Dictionary
для быстрого поиска.
Имейте в виду, это все еще не будет молниеносно для больших виртуальных списков. Каждый lv.SelectedIndices.Add(i)
вызов по-прежнему будет вызывать событие RetrieveItem
.