参数值';无效;1';对于';索引';

本文关键字:对于 索引 参数 无效 | 更新日期: 2023-09-27 18:28:38

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

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"无效

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

参数值';无效;1';对于';索引';

所选项目仅包含所选项目,但您正在对整个集合进行迭代。

  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--;
      }
    }

我认为问题是,当listView1.Items变小时,索引会增加。

您先检查Items,然后根据SelectedItems 检查索引

如果Items中有4个元素,并且只选择了第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--;
      }
    }

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

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

使用这个代码:

foreach(var item in listView.SelectedItems){ //todo }

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

就这么做吧。

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

试试这个;

 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();
      }
    }