2016-10-07 4 views
0

내 프로그램에서 ListView을 동적으로 변경하려고합니다. 모든 항목은 ImageKey이며, 나는 SmallImageList을 사용합니다.ListView에서 이미지로 ListViewItem 제거

BeforeAfter

코드 사용 : 전에하고 항목을 삭제 한 후

:

문제는 내가 항목, this question에 언급 된 문제 표시를 삭제할 때마다입니다

// Add the images from an array of paths 
foreach (string xFile in files) 
{ 
    thumbnails_imageList.Images.Add(xFile, images[xFile]); 
    files_lst.Items.Add(xFile, Path.GetFileNameWithoutExtension(xFile), xFile); 
} 

// Delete the selected key(s) 
foreach (ListViewItem xItem in files_lst.SelectedItems) 
{ 
    files_lst.Items.Remove(xItem); 
    thumbnails_imageList.Images.RemoveByKey(xItem.Name); 
} 

질문에 대한 답변 (ImageList에서 이미지를 제거하지 않는 것이 좋습니다)은 제거한 후에 동일한 ImageKey의 항목을 추가하므로 내 요구 사항을 충족시키지 않으므로 ImageSmallImageList.Images 개 이상 얻으므로 ImageKey이됩니다. 이미지가 일치하지 않게됩니다. 또한 대답은 명백한 메모리 누수를 무시합니다.

답변

0

불행히도 ImageList에서 Image을 제거하면 실제로 Items의 색인이 올라 가게됩니다. 즉, 내부적으로 Keys은 더 이상 사용되지 않지만 추가 또는 설정시 인덱스에 매핑되고 더 이상 유지되지 않습니다.

그래서 당신도 할 수있는 해결 방법 .. :

  • ImageList의 모든 Images을 유지하고 불필요한 Images와 함께 살고 있습니다. 256x256 픽셀 x 4 바이트에서 Image은 256k 만 가질 수 있으므로 메모리 낭비가 그렇게 클 수 없습니다. (AN ImageListImages에 대한 모든 핸들을 생성하지 않기 때문에. 더 GDI + 자원이 낭비되지 않습니다)하지만 주어진만큼이 문제가 될 수 ImageList의 증가 크기를 추가/제거 ...

  • 을 또는 당신은 사용할 수 있습니다 ImageKeys을 저장하고 재설정하여 이를 위해

    private void DeleteButton_Click(object sender, EventArgs e) 
    { 
        foreach (ListViewItem xItem in listView1.SelectedItems) 
        { 
         // maybe insert the loop below here (*) 
         listView1.Items.Remove(xItem); 
         // only delete when no longer in use: 
         string key = xItem.ImageKey; 
         if (listView1.Items.Cast<ListViewItem>().Count(x => x.ImageKey == key) == 0) 
          imageList1.Images.RemoveByKey(key); 
    
        } 
        // after deletions, restore the ImageKeys 
        // maybe add a check for Tag == null 
        foreach (ListViewItem xItem in listView1.Items) 
         xItem.ImageKey = xItem.Tag.ToString(); 
    
    } 
    

    올바른 키 문자열을 저장해야하는 작업 : 여기에

은 예입니다. 나는 IListViewItem.Tag 속성에서 그렇게하기로 결정했습니다. Items을 추가 할 때 또는 삭제하기 바로 전에 할 수 있습니다.

foreach (ListViewItem xItem in listView1.Items) 
     xItem.Tag = xItem.ImageKey;    // (*) 
+0

ImageIndex 속성을 사용하지 않습니다. 내 질문에 언급 한대로 이미 ImageKey를 사용합니다. – farukdgn

+0

죄송합니다. 질문을 잘못 읽었습니다. 그러나 왜 당신은 중복을 얻을 것입니까 ??? – TaW

+0

예를 들어 ImageKey = "a"인 항목을 제거합니다. 그런 다음 어느 시점에서 ImageKey = "a"로 새 항목을 추가합니다. 그러나 "a"에 대한 또 다른 이미지를 추가하여 중복됩니다. – farukdgn

0

문제는 foreach 루프에서 목록을 수정하려고한다는 것입니다. 먼저 루프를 만들고 새 목록에서 삭제할 SelectedItem을 기억하고 다음 루프에서 삭제하십시오. 이렇게하면 반복중인 목록을 편집하지 않습니다.

+0

일반적으로 사실이지만 여기서는 잘 작동하는 것 같습니다. – TaW

관련 문제