我想检查CustomFormat中的DateTime是否大于另一个DateTime,但是在代码删除了很多项目之后,检查仍然可以。这是我的代码。这项工作是删除所有3天以上的ListViewItem。
for (int i = 0; i < lvValid.Items.Count; i++)
{
if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
{
lvValid.Items[i].Remove();
}
}
我已经尝试过foreach,但是没有帮助。并删除了第二个元素,但不正确
答案 0 :(得分:2)
正向循环的一个大问题是,如果删除一项,则其余项的索引将向左移动。因此,在i == 1
处,下一项将在移除后的1
处。然后i
将递增,并跳过前一个下一个项目。
我建议使用反向循环:
for (int i = lvValid.Items.Count - 1; i >= 0 ; i--)
{
if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
{
lvValid.Items[i].Remove();
}
}
我个人建议使用原始数据。首先根据您的条件过滤数据,然后重新填充ListView
。
答案 1 :(得分:1)
也许您应该反转循环,而不要使用.AddDays(-3)
for (int i = lvValid.Items.Count - 1; i >= 0; i--)
{
if (DateTime.Now <= DateTime.Parse(lvValid.Items[i].SubItems[1].Text).AddDays(3);
{
lvValid.Items[i].Remove();
}
}
答案 2 :(得分:1)
如果要使用 forward 循环(如果要删除的顺序很重要),则在不删除项目时应增加i++
:
// we don't want redrawing on each removing (i.e. lvValid blicking)
lvValid.BeginUpdate();
try
{
for (int i = 0; i < lvValid.Items.Count; ) // don't icrement i here...
if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
lvValid.Items[i].Remove();
else
++i; // ... but there
}
finally
{
// when finisihing removing, redraw lvValid if required
lvValid.EndUpdate();
}