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





Насколько я знаю, нет другого способа, кроме как удалить их по отдельности.
Оберните свой алгоритм удаления в вызовы ListView.BeginUpdate() и ListView.EndUpdate(). Таким образом, вы не получите замедления перерисовки при каждом удалении.
Вдобавок, если вы удалите их в обратном порядке, я считаю, что у базовой структуры будет меньше работы.
Кроме того, если количество элементов, которые вы удаляете, составляет значительный процент от общего количества элементов, вы можете повысить производительность, очистив список и снова восстановив их.
Возможно, вы могли бы попробовать что-то вроде следующего:
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.
Если у вас есть коллекция selectedItems, вы можете просто вызвать remove для каждого из них вместо итерации по ListView.
В ListViewItem есть метод под названием Удалять().
ListView listview = <reference to ListView>;
foreach (ListViewItem item in listView.SelectedItems)
{
item.Remove();
}
Это удаляет итерацию по всем элементам и удаляет только выбранные элементы.
Это сработало отлично. Это самый лаконичный способ, который я когда-либо видел; спасибо Рэй.
Конечно. Самое замечательное в ListViewItems заключается в том, что они хранят ссылку на свой ListView, что делает это, вероятно, самым быстрым способом сделать это и имеет только одну итерацию.
Я заключил ваш маленький фрагмент в метод расширения для объектов ListView, поэтому теперь у меня есть простой вызов RemoveAllSelectedItems().
Для меня в linq 2 sql я использую:
mylist.Clear();
Удаление в обратном порядке не кажется быстрым. ListViewNativeItemCollection.IndexOf вызывается для каждого удаления и повторяется, начиная с 1-го элемента в списке.