Каков наиболее эффективный способ удалить все выбранные элементы в коллекции ListViewItem?

Мой пользователь может выбрать несколько элементов в коллекции ListView, которая настроена для отображения деталей (то есть списка строк).

Я хочу добавить кнопку Delete, которая удалит все выбранные элементы из коллекции ListViewItem, связанной с ListView.

Коллекция выбранных элементов доступна в ListView.SelectedItems, но у ListView.Items, похоже, нет единого метода, который позволил бы мне удалить весь диапазон. Мне нужно перебирать диапазон и удалять их один за другим, что потенциально может изменить коллекцию, которую я повторяю.

Итак, то, что мне нужно, это противоположность AddRange().

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 243
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Насколько я знаю, нет другого способа, кроме как удалить их по отдельности.

Оберните свой алгоритм удаления в вызовы ListView.BeginUpdate() и ListView.EndUpdate(). Таким образом, вы не получите замедления перерисовки при каждом удалении.

Вдобавок, если вы удалите их в обратном порядке, я считаю, что у базовой структуры будет меньше работы.

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

Удаление в обратном порядке не кажется быстрым. ListViewNativeItemCollection.IndexOf вызывается для каждого удаления и повторяется, начиная с 1-го элемента в списке.

EricLaw 07.05.2013 03:09

Возможно, вы могли бы попробовать что-то вроде следующего:

var ItemsToDelete = ... // wherever you get the collection of items to delete from
var RemainingItems = yourList.FindAll(delegate(ListItem x) {
  return !ItemsToDelete.Contains(x)
});
yourListView.DataSource = RemainingItems;
yourListView.DataBind();

или просто назначьте оставшиеся элементы существующему элементу управления, или как хотите.

(немного отредактировано форматирование)

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

Ray Booysen 17.01.2009 14:20
Ответ принят как подходящий

Если у вас есть коллекция selectedItems, вы можете просто вызвать remove для каждого из них вместо итерации по ListView.

В ListViewItem есть метод под названием Удалять().

ListView listview = <reference to ListView>;
foreach (ListViewItem item in listView.SelectedItems)
{
  item.Remove();
}

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

Это сработало отлично. Это самый лаконичный способ, который я когда-либо видел; спасибо Рэй.

Andrew 17.01.2009 14:34

Конечно. Самое замечательное в ListViewItems заключается в том, что они хранят ссылку на свой ListView, что делает это, вероятно, самым быстрым способом сделать это и имеет только одну итерацию.

Ray Booysen 17.01.2009 14:37

Я заключил ваш маленький фрагмент в метод расширения для объектов ListView, поэтому теперь у меня есть простой вызов RemoveAllSelectedItems().

Andrew 17.01.2009 14:40

Для меня в linq 2 sql я использую:

mylist.Clear();

Другие вопросы по теме