我的窗体上有一个 C# 中的 ListView 和 ImageList,并读取了一个最多包含大约 1000 个文件的目录。我使用 AddRange 方法使用文件项虚拟项的计数预填充列表视图和图像列表,以避免闪烁和闪烁的列表视图。
现在在第二步中,我只想在从文件系统读取真实项目时为虚拟项目分配正确的项目信息。到目前为止,项目文本没有问题,但我无法替换虚拟图像。如果我尝试这样做,它总是会抛出一个无效的参数异常。要使用 RemoveAtIndex 或 RemoveAtKey 删除图像,然后重新添加,我需要很长时间才能遍历 1000 个文件。1000 个文件需要 8 分钟,在 ImageList 中使用"RemoveAtKey"。"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);
}
}
}
这修复了高速向列表视图添加项目时的闪烁问题。
我仍在为您的其他问题进行一些研究和测试。