无效的参数值'1'对'index'无效

时间:2013-08-21 10:21:28

标签: c# winforms visual-studio-2010 listview

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

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

我不明白这是什么问题以及为什么只有当它是第一项时它才有效。

8 个答案:

答案 0 :(得分: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--;
      }
    }

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您检查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--;
      }
    }

答案 3 :(得分: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);
}

答案 4 :(得分:1)

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

答案 5 :(得分:0)

使用此代码而不是代码:

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

答案 6 :(得分: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);
    }

答案 7 :(得分: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();

      }
    }