如何获取图像ListView中所选项目的索引?

时间:2016-12-07 16:53:20

标签: c# winforms listview

我正在编写一个用于调整图像大小的WinForms程序,用c#。

我有一个ListView。此ListView中的项目是来自ImageList的图像。

当用户将图像拖放到表单上时,将填充ImageList和ListView。

我还创建了两个字符串数组,imageFilePaths []和imageFileNames [](这些都是不言自明的),它们与ImageList和ListView同时填充。

由于所有这四个对象都是通过dragDrop方法中的迭代填充的,因此 ImageList ListView imageFilePaths [] 和 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秒才能突出显示。 这对我很重要,因为我还有一个&#39;删除已选中的&#39;按钮。&#39;取消选择&#39;这些物品。

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

然而,它仍然非常缓慢......

3 个答案:

答案 0 :(得分:0)

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

其中i是索引并对项目进行评估

答案 1 :(得分:0)

请尝试使用ItemSelectionChanged,而不是使用SelectedIndexChanged事件。传递给该事件处理程序的事件直接为您提供相关项。无需迭代。

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

答案 2 :(得分:0)

不完全是我原本想要的答案,但我解决了通过创建存储图像尺寸(x,y)的2d数组而不是从图像中获取所选图像的尺寸来选择图像慢的问题路径,我是从图像被放到表单上时初始化的数组中获取它们的。