【问题标题】:How to properly "refresh" a winforms ListView in virtual mode?如何在虚拟模式下正确“刷新”winforms ListView?
【发布时间】:2014-03-05 15:58:55
【问题描述】:

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

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

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

【问题讨论】:

  • 不,EndUpdate() 应该总是足以让 ListView 重新绘制,从而再次触发 RetrieveVirtualItem 事件。请在您的数据结构代码中查找错误。您可以先将 VirtualListSize 任意设置为 0。
  • @HansPassant 你是对的,这是我的后台收藏管理中的一个错误。谢谢你让我回到正确的轨道上!如果您发表评论作为答案,我会接受。

标签: c# winforms listview


【解决方案1】:

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

将列表视图的 VirtualListSize 属性设置为 0 并返回您希望控件显示的实际项目数。例如。

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

【讨论】:

    【解决方案2】:

    您已经使用了正确的模式,因此问题可能出在代码的不同部分。但是,为了后代,我在这里重申这种模式。引用Hans Passant’s comment:

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

    确保在将虚拟备份切换到新数据之前致电BeginUpdate(),并在完成后致电EndUpdate()EndUpdate() 一个人不会做任何事情。使用这种模式:

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

    【讨论】:

    • 单独使用任何一种方法都没有意义。我相信 Hans 试图说明的是 实际 更新发生在 EndUpdate() 被调用时。
    • @Midas 是的,这个问题已经有了正确的模式。我想我在寻找这种模式时遇到了这个问题,如果发生这种情况,得到答案会很有帮助。我正在更新我的答案,以免造成混淆。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2023-03-30
    • 1970-01-01
    • 2011-07-21
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多