我有一个来自DevExpress的TdxfCustomComboBox的自定义组合框。它在大多数情况下都能正常工作......然后我收到了客户的报告,当他们尝试打开它时,弹出窗口需要3秒钟。经过一番调查后,我发现这是因为他们的数据库有大约12000个项目正在尝试填充,并且它会重新创建弹出窗口并每次填充它。
这意味着包含此行的StdCtrls.TListBoxStrings.Add
被调用12000次,每个字符串一次。
SendMessage(ListBox.Handle, LB_ADDSTRING, 0, Longint(PChar(S)));
处理这一行需要通过多层消息处理程序进行多次访问,并且真的让事情陷入困境。我发现这种愚蠢,因为无论如何,实际上只有十几个项目实际显示在弹出窗口中。有没有人知道一个组合框控件,不需要这种预加载,可以扩展?
编辑:不幸的是,这里不能加载12,000件商品。组合框中的项目数基于数据库中的项目数,并且它们都必须可用。也没有将它变成组合框以外的东西。没有足够的屏幕空间。
答案 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的控件,它可以根据需要翻阅相关的数据集,而不是预先加载所有的字符串。理想情况下,您也可以构建过滤器。