参数值';无效;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"无效
我不明白问题出在哪里,为什么只有当它是第一项时才有效。
所选项目仅包含所选项目,但您正在对整个集合进行迭代。
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();
}
}