如何在虚拟模式下正确“刷新”winforms ListView?

时间:2014-03-05 15:58:55

标签: c# winforms listview

我在虚拟模式下使用ListView类,以便RetrieveVirtualItem事件从独立的数据结构中提取项目。当我想对列表项进行重大编辑时,我会这样做:

listView.BeginUpdate();
try {
    [code to reset backing data structure]
    listView.VirtualListSize = backingDataStructure.Count;
}
finally {
    listView.EndUpdate();
}

但是,这似乎没有正确刷新此UI(有时添加到后备存储的新条目不会显示)。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

引用Hans Passant’s comment

  

EndUpdate()应始终足以让ListView重新绘制,从而再次触发RetrieveVirtualItem事件。

确保在将虚拟支持切换到新数据之前调用BeginUpdate(),并在完成后EndUpdate()。仅EndUpdate()不会做任何事情。使用这种模式:

listView.BeginUpdate();
currentBacking = newBacking;
listView.EndUpdate();

答案 1 :(得分:0)

我偶然发现了这个老化的问题,因为我遇到了同样的问题而且BeginUpdate()和EndUpdate()根本不起作用。如果没有在互联网上找到可行的解决方案,我发现了一个可行的假设解决方案(至少在我的情况下)。

将listview的VirtualListSize属性设置为0,然后返回希望控件显示的实际项目数。实施例

ListView.VirtualListSize = 0;
ListView.VirtualListSize = 12345;