Странное поведение при удалении изображения из ListView - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть ListView, который я заполняю содержимым ImageList.Когда элемент выбран из списка, я проверяю, существует ли файл.Если этого не произойдет, я хочу удалить его как из списка изображений (который является частным статическим), так и из ListView.По какой-то странной причине, которую я не могу понять, после удаления выбранного изображения из списка, изображение сразу после него исчезает, и последнее изображение в списке появляется дважды.Например, если в списке содержались следующие изображения: IMG1, IMG2, IMG3, IMG4, IMG5 и я удаляю IMG2 , новый список будет выглядеть следующим образом: IMG1, IMG4, IMG5, IMG5 .

Кроме того, если я выберу второе изображение из списка (которое теперь IMG4 ) и отобразит его в каком-либо элементе управления изображением, IMG3 , который должен был находиться в этом месте, будет отображаться в элементе управления.

Есть идеи, что здесь происходит?

РЕДАКТИРОВАТЬ: Заполнение представления списка:

private static ImageList stampsImages

        if (stampsImages == null)
        {
            stampsImages = new ImageList();
            stampsImages.ImageSize = new Size(125, 75);
        }

        DirectoryInfo di = new DirectoryInfo(Globals.Directory);
        if (di.Exists)
        {
            FileInfo[] dFiles = di.GetFiles("*.png");
            int stampListSize = stampsImages.Images.Count;

            for (int i = 0; i < dFiles.Length; i++)
            {
                int idx = stampsImages.Images.IndexOfKey(dFiles[i].FullName);

                if (idx < 0)
                {
                    stampsImages.Images.Add(Bitmap.FromFile(dFiles[i].FullName));
                    stampsImages.Images[stampListSize].Tag = dFiles[i].FullName; 
                    stampsImages.Images.SetKeyName(stampListSize, dFiles[i].FullName);
                    stampListSize++;
                }
            }
        }
        else di.Create();

        for (int i = 0; i < stampsImages.Images.Count; i++)
        {
            ListViewItem stmp = new ListViewItem("", i);
            lvwStamps.Items.Add(stmp);
        }
        lvwStamps.LargeImageList = stampsImages;      

Проверка наличия файла:

    private bool IsStampAvailable(int listIdx)
    {
        bool stampExists = true;
        string stampFile = stampsImages.Images.Keys[listIdx];
        if (!File.Exists(stampFile))
        {
            lvwStamps.Items.RemoveAt(listIdx);
            stampsImages.Images.RemoveAt(listIdx);
            stampExists = false;
        }

        return stampExists;
    }

Ответы [ 2 ]

0 голосов
/ 12 июля 2014

Каждый раз, когда вы удаляете изображение из ImageList, вам придется уменьшать ImageIndex каждого ListViewItem, который указывает на ImageIndex, равный или выше, чем ImageIndex удаленного изображения.Обычно достаточно линейного уменьшения, начиная с индекса Item после удаленного Item (если ImageList и ListViewItems сохраняют отношение 1: 1):

for (int i = lvItem.Index + 1; i < listView1.Items.Count; i++)
    listView1.Items[i].ImageIndex--;

Возможно, более важным является удаление элементов ПОСЛЕ переиндексации (послеудаляя ListViewItem, ListView должен перекрашиваться, и указатели должны быть в правильном порядке для этого):

int iImageIndex = lvItem.ImageIndex;
int iIndex = lvItem.Index; 
for (int i = iIndex + 1; i < listView1.Items.Count; i++) // correct the image indicies
    listView1.Items[i].ImageIndex--;       
lvItem.Remove(); // repaint
Image img = ImageList1.Images[iImageIndex];
ImageList1.Images.RemoveAt(iImageIndex);
img.Dispose();
0 голосов
/ 21 февраля 2012

Проблема в том, что элементы ListView, вероятно, запоминают индекс изображения в ImageList.Если вы удалите изображение из ImageList, элементы ListView будут указывать на неправильное изображение.

Попробуйте ссылаться на изображения по ключу, а не по индексу.


Это тестЯ сделал

imageList1.Images.Add("img0", Properties.Resources.img0); // Use key as first argument.
imageList1.Images.Add("img1", Properties.Resources.img1);
imageList1.Images.Add("img2", Properties.Resources.img2);
imageList1.Images.Add("img3", Properties.Resources.img3);
imageList1.Images.Add("img4", Properties.Resources.img4);
imageList1.Images.Add("img5", Properties.Resources.img5);
for (int i = 0; i < 6; i++) {
    var item = new ListViewItem(
        "Image #" + i, // Text
        "img" + i      // <== Use key here, not index
    );
    listView1.Items.Add(item);
}

Если я удаляю запись с ...

listView1.Items[1].Remove();
imageList1.Images.RemoveAt(1);

... она работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...