2015-12-15 4 views
1

У меня есть ListView, который загружается так:Update один элемент 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 с новой картины, который вы выбрали. Я обновляю его, повторно используя вышеприведенный код, но хочу иметь возможность обновлять только выбранное изображение, потому что я не хочу перезагружать и обновлять список. Как я могу это сделать?

+0

Как пользователи меняют изображение? – timothyclifford

ответ

0

Это сложный вопрос, потому что мой образ мышления состоял в том, чтобы обновить коллекцию изображений по ключу в экземпляре списка изображений, а затем позвонить Refresh из ListView ... но это не сработает.

Путь, который работает:

  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.

+0

Спасибо :) вот что я искал! –

0

Вы можете использовать собственность Tag на примере ListViewItem. Установите Tag на что-то значимое, например imgKey. Затем вы можете найти правильный ListViewItem, который хотите обновить, итерации по элементам и сравнения Tag с imgKey, который вы хотите обновить. Вы также можете использовать LINQ, textureViewer.Items.OfType<ListViewItem>.Where(i => i.Tag.Equals(match));

Вы можете использовать эту логику для обновления нескольких элементов, указывающих на те же теги.

Только не забудьте добавить новый imgKey и изображения в список изображений, а также обновить Tag собственности на ListViewItem, в противном случае вы можете получить исключение/ошибку.

Если imgKey не изменяется, а только фактическое изображение, то все, что вам нужно сделать, это обновить список изображений и Invalidate вид списка.

Смежные вопросы