C# 在ListView中添加项目太慢

C# 在ListView中添加项目太慢,c#,winforms,C#,Winforms,我有一个ListView,我用一个循环一个一个地向它添加项目 此ListView具有复选框 在该循环中,我决定是否选中复选框 问题是,如果选中的复选框太多,则添加项目的速度太慢 代码如下: for (int i = 0; i < dt.Rows.Count; i++) { DataRow drow = dt.Rows[i]; // Only row that have not been deleted if (drow.RowState != DataRowSta

我有一个ListView,我用一个循环一个一个地向它添加项目
此ListView具有复选框

在该循环中,我决定是否选中复选框
问题是,如果选中的复选框太多,则添加项目的速度太慢
代码如下:

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);
    }
}
for(int i=0;i

如何加快速度?

在加载结果时,在listview上调用
.BeginUpdate()
。完成后,调用
.EndUpdate()
。这将加快它的速度,因为它不会试图同时处理和绘制

// wait to draw
episodesList.BeginUpdate();

// add your items

// draw everything
episodesList.EndUpdate();
编辑 正如Justin所建议的,AddRange()可以帮助一些人,但它可能无法消除您的问题。见:

编辑#2 由于事件处理程序导致了问题,因此可以通过在加载期间删除处理程序并在加载后重新添加来解决问题。或者,您可以使用在加载之前和之后设置的全局布尔值
\u isLoading
,然后您可以在处理程序中检查
\u isLoading
,这样您就不会访问数据库。不过,删除/读取处理程序可能是更干净的解决方案


通常,当您进行大的更改时,应该将
mylistview.BeginUpdate()
放在循环之前,然后
mylistview.EndUpdate()
。这将阻止列表更新,直到调用EndUpdate()

该复选框可能会导致列表被重新绘制,从而减慢它必须完成的大量工作


您可以尝试先创建列表视图项,然后使用AddRange()方法将它们添加到列表视图中。将其列为执行方式。

可能是字符串索引器查找导致速度减慢。你能指望索引是静态的吗?您可以尝试用整数索引替换代码,看看这是否能提高性能。

可能与我编辑过的标题重复。请看,“,其中的共识是“不,他们不应该”。@pedja您是否也在计算您的Db调用时间,还是仅仅计算循环?问题是我有一个更新数据库的listView\u ItemCheck处理程序,所以每次检查项目时,我也会更新数据库啊,如果触发,肯定会导致问题。在我的回答中查看我的评论,了解解决方法。大约100,大约需要12秒add@pedja您是否尝试过先将ListViewItems填充到列表中,然后使用
listView.AddRange(mylist.ToArray())?我不认为它快多少,@Justin。一点,但不是一吨,如果这个测试是可信的:10秒添加大约100个项目?什么?马修·沃森说:“那里有点不对劲,这正是问题所在。”