2009-08-17 111 views
2

我在窗体上有一个ListView:TListview,并且添加了很多值(大约25k TListViewItem),它的工作速度非常快,但是当我调用Listview.Clear时,程序冻结了。我使用调试器对其进行了检查, t步那条线。TListView.Clear冻结我的应用程序,我该如何解决它?

我的问题是:我该如何解决我的问题?如果在不到一秒的时间内创建这么多项目是可能的,为什么删除它们需要永久(我等了超过5分钟)?

回答

13

您是否尝试过封闭您的来电清除在的BeginUpdate/EndUpdate块:

listview.Items.BeginUpdate; 
    try 
    listview.Items.Clear; 
    finally 
    listview.Items.EndUpdate; 
    end; 

添加/在ListView(或其他各种控件,如列表框)删除项目引发的一个GUI更新控制每个添加/删除的项目。对于特别的列表视图来说,这可能相当昂贵,对于25,000个项目而言,开销会很大。

无可否认5分钟听起来过度,但这将是我会尝试的第一件事。

5

我想尝试的第一件事就是将您的调用封装到Clear with BeginUpdate/EndUpdate。

ListView1.Items.BeginUpdate; 
    ListView1.Clear; 
    ListView1.Items.EndUpdate; 

你有任何附加到ListView的事件,并且它们是否在列表被清除时触发?

+0

不,我在第一个地方使用开始/结束更新。它是一样的。 – 2009-08-17 21:31:12

+0

那段时间正在某个地方度过。有任何事件发生?我会使用断点或CodeSite/OutputDebugString消息来查看。我喜欢CodeSite,因为它有一个IDE插件,可以将EnterMethod/ExitMethod消息放入单元中的所有(或多个)方法中。 – 2009-08-17 21:54:46

2

正如其他人指出BeginUpdate .... EndUpdate将大大提高性能,但我真的建议你移动你的代码来使用VirtualTreeView。这是一个混合树/ ListView,它将在不到一秒的时间内添加多达1百万个节点(实际上取决于处理器,但你明白了)。

开始学习有点困难,但一旦习惯了它,你会发现它很容易处理。我个人每当我需要在ListView或TreeView中看到很多行时,都不会比VirtualTreeView更远。哦,忘了提及它,它是免费的。尝试它:http://soft-gems.net/

2

约翰,它不应该再长时间清除比添加25k项目。
我不知道你是否加载它时,它不可见(自动禁用更新),但清除它时,它是可见的每个项目删除触发更新。

+0

它是可见的.BeginUpdate/EndUpdate是用户。 – 2009-08-17 21:32:23

0

我不知道我是否应该删除这个问题,我相信这不会对任何人有任何用处,但我宁愿保留它至少一段时间,至少对于你,谁回答。

问题是我使用了一个从TListView继承的组件,我认为这不会是一个问题,所以我决定说TListView,但我错了。

我提出了所有的答案,请原谅我的无知 - 我是新的。

+0

不要流汗。那么,你使用的是什么组件?有些东西是在家种的,还是来自第三方? – 2009-08-17 22:25:56

+0

AlphaControls,它是一个整体的皮肤包,控件从borland的vcl继承而来,它们的skinView(TsSkinView)非常糟糕。 – 2009-08-17 22:45:23

+0

究竟是什么问题?他们的明确代码太慢了吗?为什么呢? – jpfollenius 2009-08-18 06:46:26

相关问题