2009-01-17 36 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(); 
相关问题