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

Cha*_*ion 5 c# listview winforms

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

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

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

bin*_*nki 2

您已经使用了正确的模式,因此问题可能出在代码的不同部分。但是,为了后代,我在这里重申这一模式。引用Hans Passant\xe2\x80\x99s 的评论

\n
\n

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

\n
\n

确保BeginUpdate()在将虚拟支持切换到新数据之前以及EndUpdate()完成之后进行呼叫。EndUpdate()独自一人什么也做不了。使用这个模式:

\n
listView.BeginUpdate();\ncurrentBacking = newBacking;\nlistView.EndUpdate();\n
Run Code Online (Sandbox Code Playgroud)\n