我正在编写一个用于调整图像大小的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]);
}
}
然而,它仍然非常缓慢......
答案 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数组而不是从图像中获取所选图像的尺寸来选择图像慢的问题路径,我是从图像被放到表单上时初始化的数组中获取它们的。