我有一个包含许多项的ListViewItem,默认情况下所有的项都被选中。
我想写一个函数,它将获得需要检查的项目列表。
public void NewCheckSecurities(SecurityList oSecurities)
{
// error checking
if (oSecurities == null || oSecurities.Count == 0)
{
return;
}
// check sent securities
ListView.ListViewItemCollection oItems = m_lsvSecurities.Items;
if (oItems != null)
{
int i = 1;
foreach (ListViewItem oItem in oItems)
{
bool bFind = oSecurities.FindSecurity((oItem.Tag as SecurityItem).Security.Symbol) != null;
if(bFind)
{
oItem.Checked = true;
}
else
{
oItem.Checked = false;
}
}
}
}
字符串
o证券有5种证券,我想检查。
o项目大小- 2800个项目
为了检查这个问题,我不得不把这个函数拆成2个部分(find,checked)。
第一部分是一个循环,它遍历所有项,并仅使bFind为true或false。
当我把第二部分加上
if(bFind)
{
oItem.Checked = true;
}
else
{
oItem.Checked = false;
}
型
但是它工作太慢了。
当代码在做oItem的时候。在oItems中为每个oItem选中true或false是花了很长时间的。
有什么方法可以更快地完成吗?
2条答案
按热度按时间mctunoxg1#
该问题很可能是由组件在每次更新后重新绘制自身引起的。
这通常可以通过在您进行更改时告诉Form暂停视觉更新来加速,如下所示:
字符串
它应该在
this
等于Form的地方运行。或者如果你更喜欢在其他地方运行它,那么你需要将Form作为参数传递给那个方法,并在那里调用Suspend...+Resume...。chhkpiq42#
对于像
ListView
和DataGridView
这样承载大量项目的控件,提高性能的一种方法是使用VirtualMode=true
将底层列表项目的更改与UI绘制解耦。由此推论,如果您想要编写一个函数来获取需要检查的项目列表,则根本不需要接触UI,并且应该很快。字符串
生成3000个证券的列表并显示该列表后,2秒后调用
benchmark()
方法来测量获取需要检查的项目列表所需的时间,在本例中是“每四个项目”。的数据
型
列表项类
型