我有一个列表视图,我想按按钮来删除所选项目。此外,我将该项用于其他一些操作。基本上,我使用项目字符串的一些字母来匹配文件并删除它。如果所选项目是列表视图中的第一个项目,但是如果它是第二个,第三个等则不起作用,则此方法有效。
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'无效
我不明白这是什么问题以及为什么只有当它是第一项时它才有效。
答案 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();
}
}