2016-12-07 119 views
0

我正在寫一個WinForms程序來調整圖像大小,在C#中。如何獲取圖像ListView中選定項目的索引?

我有一個ListView。此ListView中的項目是來自ImageList的圖像。

當用戶將圖像拖放到表單上時,會填充ImageList和ListView。

我還創建了兩個字符串數組,imageFilePaths []和imageFileNames [](這些都是不言而喻的),它們與ImageList和ListView同時填充。

由於這些對象的所有四個都穿過的DragDrop方法迭代填充,所以的ImageList的ListViewimageFilePaths []imageFileNames []匹配起來完美的索引。

我有一個ListView的事件監聽器。當單擊ListView中的某個項目時,我會從與ListView.SelectedItems索引匹配的索引位置處的前面提到的數組中獲取文件名和文件路徑。這裏的代碼:

private void imageListView_SelectedIndexChanged(object sender, EventArgs e)   
    { 
     foreach (ListViewItem item in imageListView.SelectedItems) 
     { 
      int imgIndex = item.ImageIndex; 
      if (imgIndex >= 0 && imgIndex < imageList1.Images.Count) 
      { 
       filenameTb.Text = imageFileNames[imgIndex]; 
       updateDimensions(imageFilePaths[imgIndex]); 
      } 
     } 
    } 

這工作,但不是我想。例如,如果我在ListView中有20個圖像,並嘗試通過Shift-點擊來區域選擇這些項目,則需要大約10-20秒才能突出顯示所有這些項目。 這對我很重要,因爲我也有一個'刪除選定'按鈕。只需「取消選擇」這些項目即可。

我95%確定這是因爲此事件偵聽器正在循環顯示每個選定項目的維度和文件名,直到它到達最後一個項目,即使這不是必要的。

我怎麼能重寫這個,以便我只能得到所選項目的索引,或者如果選擇了多個索引,最後一個的索引?

感謝

編輯:根據意見,我看過了將selectedIndices屬性,嘗試這樣做:

private void imageListView_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ListView.SelectedIndexCollection indexes = this.imageListView.SelectedIndices; 
     foreach (int index in indexes) 
     { 
      filenameTb.Text = imageFileNames[index]; 
      updateDimensions(imageFilePaths[index]); 
     } 
    } 

它仍然然而痛苦的緩慢...

+0

你只使用索引,我相信''ListView'上有'SelectedIndices'屬性,你可以使用它,所以你不會經常返回完整的項目給調用者。 – TheLethalCoder

+0

[如何獲取多選列表框中最後選定的項目?](http://stackoverflow.com/questions/305555/how-to-get-the-last-selected-item-in-multiselect-listbox) – TheLethalCoder

+0

嘿,請看我編輯的 –

回答

0
foreach (ListViewItem item in imageListView.SelectedItems.Select((value, i) => new { i, value }) 
{ 
    //your code 
} 

我在哪裏索引和值的項目

+0

我不明白這是怎麼回答的問題 – TheLethalCoder

0

而不是使用SelectedIndexChanged事件,t使用ItemSelectionChanged。傳遞給該事件處理程序的事件直接爲您提供相關項目。無需迭代。

 private void imageListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     e.Item ... <- this is your item 
     e.ItemIndex ... <- this is your item's index 
    } 
+0

雖然,一定要檢查e.IsSelected屬性。因爲這個事件將在選擇和取消選擇時被解僱。 – dviljoen

0

不正是我一直在尋找的,可是我解決了通過創建存儲圖像尺寸(X,Y)的二維數組選擇圖像是緩慢的,而不是領的尺寸問題的答案的選擇圖像來自圖像路徑,我從數組中獲取它們,這些數組在圖像被放置到表單上時被初始化。

相關問題