2009-01-17 37 views
3

我的用戶可以選擇配置爲顯示詳細信息(即行列表)的ListView集合中的多個項目。刪除ListViewItem集合中所有選定項目的最有效方法是什麼?

我想要做的是添加一個Delete按鈕,該按鈕將刪除與ListView關聯的ListViewItem集合中的所有選定項目。

所選項目的集合可在ListView.SelectedItems中找到,但ListView.Items似乎沒有讓我刪除整個範圍的單一方法。我必須遍歷範圍並逐個刪除它們,這可能會修改我正在迭代的集合。

所以,我基本上是跟AddRange()相反。

回答

4

如果你有你的selectedItems的的收集,你可以簡單地調用取消對他們每個人的,而不是遍歷的ListView。

ListViewItem上有一個名爲Remove()的方法。

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

這將刪除所有項目的迭代,只刪除所選項目。

+0

這工作完美。這是迄今爲止我看到的最簡潔的方式;謝謝Ray。 – Andrew 2009-01-17 11:34:18

1

據我所知,除了單獨刪除它們之外別無他法。

將您的刪除算法包裝在ListView.BeginUpdate()ListView.EndUpdate()調用中。通過這種方式,每次刪除都不會導致重新繪製速度變慢。

此外,如果你以相反的順序刪除它們,我相信底層結構將有更少的事情要做。

另外,如果要刪除的項目數佔項目總數的很大比例,則可以通過清除列表並將它們再次取回來獲得更多性能。

+0

以相反的順序刪除似乎並不快。每次移除都會調用ListViewNativeItemCollection.IndexOf,它會從列表中的第1項開始迭代。 – EricLaw 2013-05-06 23:09:10

-1

也許你可以嘗試的東西沿着以下行:

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(); 

或只是分配剩餘的項目,以現有的控制,或任何你喜歡的。

(編輯格式略)

+0

這相當低效。對於列表視圖中的每個項目,您正在遍歷ItemsToDelete集合。 – 2009-01-17 11:20:19

0

對於我來說,在LINQ 2 SQL我用:

mylist.Clear(); 
相關問題