6

我有一个 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);
    }
}

我怎样才能让它更快?

4

3 回答 3

9

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

// wait to draw
episodesList.BeginUpdate();

// add your items

// draw everything
episodesList.EndUpdate();

编辑

正如贾斯汀建议的那样, AddRange() 可以帮助一些人,但它可能不会消除您的问题。请参阅:如何加快将项目添加到 ListView?

编辑#2

由于事件处理程序导致问题,您可以通过在加载期间删除处理程序并在之后重新添加它们来解决它们。或者,您可以使用_isLoading您在加载之前和之后设置的全局布尔值,然后您可以签_isLoading入您的处理程序,这样您就不会前往 Db。不过,删除/读取处理程序可能是更清洁的解决方案。

删除事件处理程序

于 2013-05-02T17:11:57.933 回答
1

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

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

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

于 2013-05-02T17:14:00.177 回答
0

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

于 2013-05-02T18:11:21.770 回答