可以快速打开大量项目的组合框

时间:2010-12-22 20:18:47

标签: delphi controls

我有一个来自DevExpress的TdxfCustomComboBox的自定义组合框。它在大多数情况下都能正常工作......然后我收到了客户的报告,当他们尝试打开它时,弹出窗口需要3秒钟。经过一番调查后,我发现这是因为他们的数据库有大约12000个项目正在尝试填充,并且它会重新创建弹出窗口并每次填充它。

这意味着包含此行的StdCtrls.TListBoxStrings.Add被调用12000次,每个字符串一次。

SendMessage(ListBox.Handle, LB_ADDSTRING, 0, Longint(PChar(S)));

处理这一行需要通过多层消息处理程序进行多次访问,并且真的让事情陷入困境。我发现这种愚蠢,因为无论如何,实际上只有十几个项目实际显示在弹出窗口中。有没有人知道一个组合框控件,不需要这种预加载,可以扩展?

编辑:不幸的是,这里不能加载12,000件商品。组合框中的项目数基于数据库中的项目数,并且它们都必须可用。也没有将它变成组合框以外的东西。没有足够的屏幕空间。

7 个答案:

答案 0 :(得分:7)

我能想到的最好的解决方案是使用TButtonEdit,当你点击按钮时,TVirtualStringTree(闪电般快速)会弹出包含这些项目的信息,每当用户点击一个项目时,弹出窗口将关闭并且选中项目将显示在TButtonEdit的文本属性中 - 这可以在几分钟内完成(5-10)

答案 1 :(得分:2)

另一种可能性:您可以在启动时创建组合框并保留它,在您需要时在此表单上重新创建吗?

如果失败了,您可以将字符串加载到另一个字符串列表中吗。并根据需要分配给组合框? (我不熟悉TListBoxStrings。)

答案 2 :(得分:1)

一些选项。

1. /你真的需要填充12,000件物品吗?你可以使用一些过滤方案,只返回该数据的子集吗?

2. /你必须使用组合框吗?你有屏幕空间来使用虚拟列表视图吗? (自己处理存储和分页)

3. /创建您自己的虚拟组合框...在虚拟列表视图中建模虚拟化技术。

4. /作弊...而不是组合框,使用带有“浏览”按钮的编辑框,打开一个可以动态填充的列表。

据我所知,没有任何模式可以让你使用dev express(或native)组合框。

答案 3 :(得分:1)

ComboBoxes和ListViews在指数曲线上遇到性能下降,成千上万的项目变得非常糟糕。如果您有超过几千个,请尽可能使用虚拟列表。

答案 4 :(得分:1)

也许你可以使用LookupComboBox(也来自DevExpress)。在这里,您可以将数据加载到Comboboxs引用它的单个DataSet中。

答案 5 :(得分:1)

这只是一个愚蠢的设计!更好的选择是添加用户可以单击的按钮。当他点击它时,会打开一个新表单,其中包含与选项表的连接,它将以您喜欢的方式显示所有选项。然后用户必须选择一个,可以使用pageUp / PageDown和各种过滤器,因为 - 当然 - 您将使用DBGrid显示选项,然后用户单击“选择”按钮将返回所选选项返回。
新表格将提供您需要的所有空间!
从设计角度来看,任何考虑使用12.000选项的下拉列表的人都会被这个软件的用户视为傻瓜!无论你做多快,它肯定会让它变得非常不受欢迎!为什么你说?因为用户无法在没有其他搜索选项的情况下找到他们需要的内容!

答案 6 :(得分:0)

老实说,三秒钟听起来非常适合将12000条记录加载到这样的控件中。

下拉列表是否必须从TdxfCustomComboBox下载?我认为你最好在这里滚动你自己的类似combo-box的控件,它可以根据需要翻阅相关的数据集,而不是预先加载所有的字符串。理想情况下,您也可以构建过滤器。