【问题标题】:ListView <--> ImageList Will Not SyncListView <--> ImageList 不会同步
【发布时间】:2011-12-16 01:35:08
【问题描述】:

我正在使用 ListView 加载和显示图像文件的缩略图。我为每个 ListViewItem 使用的“名称”或键是完全限定的文件名。

我还创建了一个 ImageList,它使用相同的键加载这些文件的缩略图。我已将此 ImageList 分配为 ListView 的“SmallImageList”属性。

当我添加和删除文件时,我从 ListView.Items 和 ImageList.Images 集合中按键添加和删除它们。

在加载许多图像时,所有这些都可以正常工作。但是,当我尝试删除给定键时,ListView 控件不再正确显示缩略图。

删除项目前后:

当我在调试期间分析内存中的两个集合数组时,键完全对齐。

使用的代码:

// Add the images from an array of paths
foreach (string xFile in files)
{
    thumbnails_imageList.Images.Add(xFile, images[xFile]);
    files_lst.Items.Add(xFile, Path.GetFileNameWithoutExtension(xFile), xFile);
}

// Delete the selected key(s)
foreach (ListViewItem xItem in files_lst.SelectedItems)
{
    files_lst.Items.Remove(xItem);
    thumbnails_imageList.Images.RemoveByKey(xItem.Name);
}

【问题讨论】:

  • 我刚刚将代码转换为基于索引的键,我遇到了同样的问题。
  • 对于一个让您删除图像并仍然保持项目指向正确索引的解决方案see this post!

标签: c# .net winforms listview imagelist


【解决方案1】:

发生的事情很清楚,如果您有一个绑定到图像索引 5ListViewItem 并且您删除了位置 4 的图像,则 5 会下降到 4 并且该项目会保留对 5 的引用所以不显示任何图像。

我认为当您删除选定的 ListView 项目时,您不应该从 ImageList 中删除图像。

【讨论】:

  • 这不会严重泄漏内存吗?如果您从不从列表中删除图像,并且一遍又一遍地运行代码,那么您最终会得到一个巨大的 ImageList,其中大多数图像从未使用过。你将如何解决这个问题?
  • 对于一个让您删除图像并仍然保持项目指向正确索引的解决方案see this post!
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多