我的代码根据文本框搜索条件正确识别列表视图行。但是,当我尝试删除不需要的行时,我收到一条错误消息: -
InvalidArgument ='-1'的值对'index'无效。
如果有人能帮我解决这个问题,我将非常感激..提前致谢。
foreach (ListViewItem item in listView1.Items){
foreach (ListViewItem.ListViewSubItem subItem in item.SubItems){
if (subItem.Text.ToLower().StartsWith(textBox1.Text.ToLower())){
var index = item.Index;
int.TryParse(listView1.Items[index].SubItems[4].Text, out val);
store[pos] = val;
pos++;
count++;
}else{
listView1.Items[index].Remove();
}
}
}
答案 0 :(得分:0)
问题在于,您不会在条款'其他'
中计算您的索引}else{
listView1.Items[index].Remove();
}
答案 1 :(得分:0)
你不能从正在迭代Foreach的集合中删除项目,c#会因为集合发生变化而引发错误,而是用于代替,并从头到尾进行(所以你赢了#t; t删除时跳转项目
答案 2 :(得分:0)
尝试这种方法:
评论在代码中。如果您需要其他解释,请随时询问。
解决方案w / Linqstore
编辑:已删除的代码,它会删除不以文本框开头的项目'文本(如OP想要的)。
编辑2:既然你不想使用Linq,你可以使用普通的旧列表和循环来解决你的问题
正如我在评论中所说,主要的是,在找到所有需要删除的项目之后,不要删除foreach循环内的项目。
代码经过测试和运行(没有4行,缺少变量val
,//list to hold intem indexes
List<int> itemIndexes = new List<int>();
foreach (ListViewItem item in listView1.Items)
{
foreach (ListViewItem.ListViewSubItem subItem in item.SubItems)
{
var index = item.Index;
if (subItem.Text.ToLower().StartsWith(textBox1.Text.ToLower()))
{
//your code (which doesnt compile since you didn't paste whole code)
//to test this, I had to remove following 4 lines.
int.TryParse(listView1.Items[index].SubItems[4].Text, out val);
store[pos] = val;
pos++;
count++;
}
else
{
itemIndexes.Add(index);
}
}
}
//lastly, sort indexes descending (for example: 10, 5,4,1)
//because if you remove item 1, whole list will shorten and
//you'll get index out of bounds error (in last step when
//trying to remove item with 10 but last index is 7)...
itemIndexes.Reverse();
//... and remove them from listview
foreach (int index in itemIndexes)
{
listView1.Items.RemoveAt(index);
}
等等。)
没有Linq的解决方案
a
使用示例数据进行测试 - 代码将删除不以bbb
开头的项目,例如dd
和ListView listView1 = new ListView();
listView1.Items.Add("aaa");
listView1.Items.Add("bbb");
listView1.Items.Add("ax");
listView1.Items.Add("dd");
TextBox textBox1 = new TextBox();
textBox1.Text = "a";
)
{{1}}