我有一个ListView,我用循环逐个添加项目 这个ListView有CheckBoxes
在该循环中,我决定是否应该选中复选框 问题是,如果要检查太多复选框,则添加项目太慢了 这是代码:
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow drow = dt.Rows[i];
// Only row that have not been deleted
if (drow.RowState != DataRowState.Deleted && int.Parse(drow["season"].ToString()) != 0)
{
ListViewItem lvi = new ListViewItem(drow["episode_name"].ToString());
lvi.SubItems.Add(drow["first_aired"].ToString());
lvi.SubItems.Add(drow["episode"].ToString());
lvi.SubItems.Add(drow["season"].ToString());
lvi.SubItems.Add(drow["rating"].ToString());
lvi.SubItems.Add(drow["episode_id"].ToString());
if (bool.Parse(drow["watched"].ToString()))
{
lvi.Checked = true; //this is the problem, when i remove it, adding is fast
}
else {
lvi.Checked = false;
}
episodesList.Items.Add(lvi);
}
}
如何让它更快?
答案 0 :(得分:6)
在列表视图中,在加载结果时调用.BeginUpdate()
。完成后,请致电.EndUpdate()
。这应该加快速度,因为它不会同时处理和绘制。
// wait to draw
episodesList.BeginUpdate();
// add your items
// draw everything
episodesList.EndUpdate();
正如Justin所说,AddRange()可以帮助一些人,但它可能不会消除你的问题。请参阅:How to speed adding items to a ListView?
由于事件处理程序导致了问题,您可以通过在加载期间删除处理程序并在之后重新添加它们来解决它们。或者,您可以使用在加载之前和之后设置的全局布尔值_isLoading
,然后您可以在处理程序中检查_isLoading
,这样就不会到达Db。但是,删除/读取处理程序可能是更清晰的解决方案。
答案 1 :(得分:1)
通常,当您进行大量更改时,应将mylistview.BeginUpdate()
置于循环之前mylistview.EndUpdate()
。这将阻止列表更新,直到您调用EndUpdate()。
复选框可能导致列表重绘,从而减慢了它必须完成的大量工作。
您可以先尝试创建列表视图项,然后使用AddRange()方法将它们添加到列表视图中。 MSDN将其列为推荐方式。
答案 2 :(得分:0)
可能是字符串索引器查找导致速度减慢。你能指望索引是静态的吗?您可以尝试使用整数索引替换代码,看看是否可以提高性能。