2012-02-21 6 views
0

私はImageListの内容を取り込むリストビューを持っています。アイテムがリストから選択されると、ファイルがまだ存在するかどうかがチェックされます。それができない場合は、イメージリスト(プライベート静的)とListViewの両方から削除します。 私は理解できないいくつかの奇妙な理由のために、リストから選択したイメージを削除した後、イメージは消え、リストの最後のイメージは2回現れます。 例えば、リストは以下の画像保持していた場合:IMG1、IMG4、IMG5、IMG5IMG1、IMG2、IMG3、IMG4、IMG5を、私はIMG2を削除し、新しいリストは次のようになります。私はリストから第2の画像を選択した場合ListViewから画像を削除する際の異常な動作

さらに、一部の画像コントロールに表示、その場所にあると仮定されたIMG3は、コントロールに表示される(今IMG4です)。

ここで何が起こっているのですか?

EDIT:ファイルがまだ存在するかどうかのチェック

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; 
    } 
+0

WinFormsまたはWebForms? – DaveShaw

+0

いくつかのコードはおそらくあなたが思っていることの説明よりも役に立つでしょう。実際に何をしているのではなく、あなたのコードが何をしているのかだけを記述するつもりです。もしあなたがここにいないと期待していたら... –

+0

そして、インデックスの問題。 –

答えて

0

問題は、リストビューのアイテムは、おそらくイメージリスト内の画像のインデックスを覚えているということです。 ImageListからイメージを削除すると、ListViewアイテムは間違ったイメージを指します。

インデックスではなくキーでイメージを参照しようとします。


これは私が

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

...のエントリを削除した場合、私はそれが正常に動作します...

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); 
} 

を作ったテストです。

+0

何らかの理由で、それは私にとってはうまくいかないようです。私はインデックスの代わりにキーを使用しているとき、私はListviewの画像は表示されません。 – Guy

+0

ListViewItem.Add(キャプション、キー);と画像 'imageList1.Images.Add(key、image);'に与えられたキーが同じであることを確認していますか? 'Image.Add'の最初の引数ですが、' ListViewItem.Add'の2番目の引数です。 –

+0

はい、確信しています。私はもう一度試してみましたが、画像は表示されません。 – Guy

0

ImageListからイメージを削除するたびに、削除されたイメージのImageIndex以上のImageIndexを指す各ListViewItemのImageIndexを減らす必要があります。たぶんもっと重要な

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

削除した後(インデックス再作成AFTER項目を削除することです。通常の線形減少は(:1リレーションイメージリストとListViewItemsは1を続ければ)削除されたアイテムの後のアイテムのインデックスから始まる十分です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(); 
関連する問題