簡體   English   中英

從ListView刪除圖像時出現奇怪的行為

[英]Strange behavior while removing image from ListView

我有一個ListView,其中填充了ImageList的內容。 從列表中選擇一個項目時,我檢查文件是否仍然存在。 如果不是,我想將其從“圖像列表”(為私有靜態)和“列表視圖”中都刪除。 由於某些奇怪的原因(我不知道),從列表中刪除所選圖像后,緊隨其后的圖像消失了,列表中的最后一個圖像出現了兩次。 例如,如果列表舉行了下列圖片: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;
    }

每次從ImageList中刪除圖像時,都必須減小每個ListViewItem的ImageIndex,使其指向等於或高於已刪除圖像的ImageIndex的ImageIndex。 通常,從刪除的項目后的項目索引處開始,線性減少就足夠了(如果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();

問題在於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);

...它正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM