C#listview图像列表快速添加多个项目

C#listview图像列表快速添加多个项目,c#,listview,imagelist,addrange,C#,Listview,Imagelist,Addrange,我的表单上有一个C#格式的ListView和ImageList,读取的目录最多有1000个文件。 我使用AddRange方法预先填充ListView和ImageList,其中包含fileItems和DummyItems的计数,以避免ListView闪烁和闪烁 现在在第二步中,我只想在从文件系统读取真实项的同时,将正确的项信息分配给虚拟项。 项目文本完全没有问题,但我无法替换虚拟图像。如果我尝试这样做,它总是抛出一个无效参数异常。要使用RemoveAtIndex或RemoveAtKey删除图像,然

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

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

首先,您可能需要创建一个名为“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);
        }
    }
}
这修复了在高速向列表视图添加项目时出现的闪烁问题


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

你能发布你的代码吗?