使用巨大的列表项检查listview中的所有项目?

时间:2011-12-19 02:31:18

标签: c# .net winforms listview

我想查看listview中的约3000项。这是一些代码:

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

但是当检查项目时,listview非常慢。请给我一些解决这个问题的想法?谢谢。

6 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这样的事情对你有用吗? ...选中后,将项目添加到词典...取消选中后,从词典中删除。没有经过测试的代码,但想知道你是否可以这样做:

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

你问如何更好地解决这个问题。我所说的是在您的支票活动中,您需要将项目添加到列表视图中。我怀疑用户是否会实际检查所有3000,因此更改代码以决定如何处理已检查项目,我给你的示例使用Lambda表达式。如果不熟悉,请更改您的问题以反映您实际需要和/或想要的内容......

答案 2 :(得分:0)

我听说有传言说对于大型列表项,for循环比foreach循环更快 尝试

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

答案 3 :(得分:0)

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

这样的事情:

  tv=(TextView)findViewById(R.id.textView1);
    result=(TextView)findViewById(R.id.result);

    Bundle data=getIntent().getExtras();
    String marks=data.getString("TotalMarks");
     result.setText(marks);

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

调用BeginUpdate会阻止控件绘制,直到调用EndUpdate方法为止。