更新单个ListView项

本文关键字:ListView 单个 更新 | 更新日期: 2023-09-27 18:26:58

我有一个ListView,它的加载方式如下:

ImageList imgList = new ImageList();
textureViewer.LargeImageList = imgList;
textureViewer.LargeImageList.ImageSize = new System.Drawing.Size(50,50);
foreach (Texture t in textureList)
{
     string imgKey = System.IO.Path.GetFileNameWithoutExtension(t.imageName);
     imgList.Images.Add(imgKey, t.image);
     ListViewItem item = new ListViewItem();
     item.Text = imgKey;
     item.ImageKey = imgKey;
     textureViewer.Items.Add(item);
}

我的程序允许您随时更改图像,因此我必须使用您选择的新图片更新ListView。我通过重复使用上面的代码来更新它,但我希望只能更新选定的图片,因为我不想重新加载和刷新列表视图。我该怎么做?

更新单个ListView项

这是一个棘手的问题,因为我的想法只是通过键入图像列表实例来更新图像集合,然后调用ListViewRefresh。。。但它不起作用。

工作方式:

  1. 按键从图像集合中删除图像
  2. 将具有相同键的新图像添加到图像集合中

我假设您想使用密钥更新图像

Image newImage = ... // new image
string imgKey = ... // the key of the image to update
// find the previous image by key
Image previousImage = imgList.Images[imgList.Images.Keys.IndexOf("imgKey")];
// remove the previous image from the collection
imgList.Images.RemoveByKey(imgKey);
// add a new image
imgList.Images.Add(imgKey, newImage);
// dispose the previous image
previousImage.Dispose();            

我已经添加了对Dispose方法的调用。

您可以在ListViewItem实例上使用Tag属性。将Tag设置为有意义的内容,如imgKey。然后,您可以通过迭代项并将Tag与要更新的imgKey进行比较来找到要更新的正确ListViewItem。您也可以使用LINQ、textureViewer.Items.OfType<ListViewItem>.Where(i => i.Tag.Equals(match));

您可以使用此逻辑来更新指向同一标记的多个项目。

只需记住将新的imgKey和图像添加到图像列表中,并更新ListViewItem上的Tag属性,否则可能会出现异常/错误。

如果imgKey没有更改,而只更改实际图像,那么您所要做的就是更新图像列表和Invalidate列表视图。