2

我有一个列表视图,我想在按下按钮时删除所选项目。此外,我将该项目用于其他一些操作。基本上,我使用项目字符串的一些字母来匹配文件并将其删除。如果所选项目是列表视图中的第一个,则此方法有效,但如果它是第二个、第三个等,则无效。

private void delete_button_Click(object sender, EventArgs e)
{
  for (int i = 0; i < listView1.Items.Count; i++)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.SelectedItems[i].ToString(); //error
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }
 }

它会引发错误

未处理 ArgumentOutofRangeException” - '1' 的无效参数值对 'index' 无效

我不明白问题出在哪里,为什么它只有在第一项时才有效。

4

8 回答 8

2

选定的项目仅包含选定的项目,但您正在迭代整个集合。

  for (int i = 0; i < listView1.Items.Count; i++)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.Items[i].ToString();  // <-------
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }
于 2013-08-21T10:23:30.647 回答
2

我认为问题在于,您的索引会增加而listView1.Items变小。

于 2013-08-21T10:24:05.103 回答
2

您检查Items开始,然后检查索引SelectedItems

如果有 4 个元素Items并且只选择了第 4 个元素,则SelectedItems有 1 个项目,但i将是 4

  for (int i = 0; i < listView1.SelectedItems.Count; i++)
    {
        string var1 = listView1.SelectedItems[i].ToString();
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }
于 2013-08-21T10:24:08.360 回答
2

var1需要来自Items,而不是来自SelectedItems。像这样:

private void delete_button_Click(object sender, EventArgs e)
{
  for (int i = 0; i < listView1.Items.Count; i++)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.Items[i].ToString(); //NOTE THE DIFFERENCE
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }

但事实上,一个更好的方法是这样的:

private void delete_button_Click(object sender, EventArgs e)
{
  foreach (var x in listView1.SelectedItems.Select(x => x))
    listView1.Items.Remove(x);
}
于 2013-08-21T10:24:08.710 回答
1

这是因为您正在遍历列表框中的项目,而不是选定的项目。例如,如果您在框中有 10 个项目,并且您选择了 2 个,那么当它进入第三次迭代时,它将失败。

于 2013-08-21T10:24:23.820 回答
0

如果您有一个只有选定的集合,为什么要迭代所有元素?

就这样做。

    foreach(var var1 in listView1.SelectedItems.ToArray())
    //the to array is to create e new collection from the list else you get one error when you change it.
    {
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items.Remove(var1);
    }
于 2013-08-21T10:30:30.703 回答
0

尝试这个;

 for (int i = listView1.Items.Count-1; i >=0 ; i--)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.SelectedItems[i].ToString(); //error
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();

      }
    }
于 2013-08-21T10:30:54.297 回答
0

使用这个代替你的代码:

foreach(var item in listView.SelectedItems){ //todo }
于 2013-08-21T10:28:17.287 回答