C#listview imagelist快速添加很多项目

时间:2012-06-24 15:42:02

标签: c# listview imagelist addrange

我的表单上有一个C#中的ListView和ImageList,并且读取一个最多有1000个文件的目录。 我使用AddRange方法预先填充ListView和ImageList以及fileItems DummyItems的计数,以避免闪烁和掠夺ListView。

现在,在第二步中,我只是想在从文件系统中读取实际项目时将正确的项目信息分配给虚拟项目。 项目文本没有问题,但我不能替换虚拟图像。如果我尝试这样做,它总是抛出一个无效的参数异常。要使用RemoveAtIndex或RemoveAtKey删除图像,然后重新添加将花费我很长时间来遍历1000个文件。使用ImageList中的“RemoveAtKey”,1000个文件需要8分钟。 “RemoveAtKey”是我发现的瓶颈。 如果我尝试清除之前的所有图像并再次使用AddRange重新填充,则我的项目图像将变为空白或发生异常。 有人知道如何从1000个文件中快速将1000个不同的缩略图用文件名快速导入listview控件,而不是我使用的其他方法吗?

1 个答案:

答案 0 :(得分:0)

首先,您可能需要使用以下代码创建名为“ListViewNF”的新用户控件:

class ListViewNF : System.Windows.Forms.ListView
{
    public ListViewNF()
    {
        //Activate double buffering
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

        //Enable the OnNotifyMessage event so we get a chance to filter out 
        // Windows messages before they get to the form's WndProc
        this.SetStyle(ControlStyles.EnableNotifyMessage, true);
    }

    protected override void OnNotifyMessage(Message m)
    {
        //Filter out the WM_ERASEBKGND message
        if(m.Msg != 0x14)
        {
            base.OnNotifyMessage(m);
        }
    }
}

这可以解决在高速向列表视图中添加项目时的闪烁问题。

我还在为你的另一个问题做一些研究和测试。