清空ListView

9
我有一个简单的Windows窗体,其中包含一个名为“list”的ListView对象和其他组件。在该窗体上,一个按钮使我能够通过单击“list.Items.Clear()”来清空列表。这很好用。
现在我有一个名为“Test”的单独类,其方法“update()”在某些外部事件上被调用。在构建窗体时,我使用“SetList”方法传递了对列表的引用。在调试模式下,我触发事件时会调用“update()”,并执行其内容,但我的列表没有被清除。
为什么会这样?引用已经正确设置,我已经检查过了。
class Test
{
   private ListView list;

   public void setList(ListView list)
   {
      this.list = list;
   }

   public void update()
   {
      this.list.Items.Clear();
   }
}

当我通过在update()函数中设置断点来仔细查看我的列表时,列表被清除并保持清除状态。它真的看起来像是另一个列表被修改了,但我只有一个列表,并且从未对其进行任何新的操作... ????


1
如果使用数据源绑定项目,请尝试使用 list.DataSource = null; list.DataBind(); - sll
我的猜测是它不是。我总是通过这种方法添加:this.list.Items.Add。 - BuZz
3
像这样的代码有95%可能是在清除另一个窗体实例的列表视图,但该实例并不可见,因为您使用了“new”创建它,而不是使用可见的窗体实例。 - Hans Passant
尝试在 this.list.Items.Clear(); 后面的下一行设置断点,并在调试器中查看是否已清除 Items,也许是一些外部代码添加了项目,谁知道在您的应用程序中会发生什么... - sll
它是否被清空,然后立即重新填充? - Steve Wellens
显示剩余4条评论
2个回答

6
请使用下面修改过的update方法:
   public void update()
   {
      this.list.Items.Clear();
      this.list.Update(); // In case there is databinding
      this.list.Refresh(); // Redraw items
   }

如果这样做不起作用,那么很明显你正在修改另一个list对象的实例。在这种情况下,暂时修改对象的声明如下,并查看是否有任何变化。如果有,你需要检查代码以确保清除正确的列表实例:

private static ListView list;

0
在我的情况下,我没有使用数据绑定,而是使用Add()循环显式添加项目。我发现ListView.Clear()和ListView.Items.Clear()似乎不起作用。
结果证明... ListView实际上已经被清除了,但我没有清除输入列表,因此我实际上是在清除并重新填充ListView以前清除的项目。
有时候最简单的事情也会出错...D'OH!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接