2016-12-07 81 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)的二维数组选择图像是缓慢的,而不是领的尺寸问题的答案的选择图像来自图像路径,我从数组中获取它们,这些数组在图像被放置到表单上时被初始化。

相关问题