检查所有项目在列表视图与巨大的列表项目

本文关键字:项目 列表 巨大 视图 检查 | 更新日期: 2023-09-27 18:18:09

我想检查listview中大约3000个项目。这是一小段代码:

foreach (ListViewItem item in this.lvItem.Items)
{
    item.Checked = !item.Checked;
}

但是当item被选中时,listview是非常慢的。请给我一些解决这个问题的建议。谢谢。

检查所有项目在列表视图与巨大的列表项目

我也有同样的问题,但我找到了原因。

我有一个"ItemChecked"事件处理程序附加到我的listView,它正在做一些繁重的事情。

我删除了eventandler,它解决了我的问题。尝试删除任何"ItemChecked"事件处理程序,看看速度是否更好。

需要在循环前调用BeginUpdate,在循环后调用EndUpdate:

listView1.BeginUpdate();
foreach (ListViewItem item in listView1.Items)
    item.Checked = true;
listView1.EndUpdate();

调用BeginUpdate阻止控件绘制直到EndUpdate方法被调用。

我听说对于大型列表项,for循环将比foreach循环更快试着

for(int i = 0; i = < this.1vItem.Items.Count; i++)
{
//Stuff
}

我也不认为期望用户点击3000项是明智的。但是我最近做的一件事是,在添加项目时,知道不会有很多项目,默认情况下应该检查它们,在将它们添加到列表之前检查项目

像这样:

foreach (Recipient recipient in recipients)
{
    var item = new ListViewItem(recipient.FirstName + " " + recipient.LastName);
    item.Tag = recipient;
    item.Checked = true;
    lvRicipients.Items.Add(item);
}

这样的东西对你有用吗?…选中后,将项目添加到Dictionary中…未选中时,从字典中删除。没有测试过的代码,但想知道你是否可以这样做:

Dictionary<String, ListViewItem> Dic = listView.Items 
    .Cast<ListViewItem>() 
    .ToDictionary(x => x.Text, x => x.SubItems[0].Checked); 

你问如何更好地去做。我所说的是在您的Check Event中,您将需要向列表视图中添加项目。我怀疑用户是否真的会检查所有3000个项目,因此更改代码以决定如何处理检查过的项目,我给您的示例使用Lambda表达式。如果不熟悉,请修改你的问题,以反映你实际需要和/或想要的是什么。

for (int i = 0; i <= listView1.Items.Count - 1; i++)
{
     if (!listView1.Items[i].Checked)
     listView1.Items[i].Checked = true;
}