更新单个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
的Refresh
。。。但它不起作用。
工作方式:
- 按键从图像集合中删除图像
- 将具有相同键的新图像添加到图像集合中
我假设您想使用密钥更新图像
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
列表视图。