2010-12-22 57 views
3

我有一个自定义的组合框,来自DevExpress的TdxfCustomComboBox。它在大多数情况下工作得非常好...然后我从客户那里得到一个报告,当他们试图打开它时,弹出窗口出现需要3秒。经过一番调查后,我发现这是因为他们的数据库中有大约12000个试图填充的项目,并且它会重新创建弹出窗口并每次填充它。可以快速打开很多项目的组合框

这意味着包含该行的StdCtrls.TListBoxStrings.Add被称为12000+次,每个字符串一次。

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

处理这一行需要通过消息处理程序的多层好几趟,真正停滞不前下来。我觉得这种愚蠢,因为只有大约十几个项目实际上一次显示在弹出窗口中。有谁知道组合框控件不需要这种预加载并可以缩放?

编辑:不幸的是,使它不加载12,000项不是一个选项在这里。组合框中的项目数量取决于数据库中的项目数量,它们都必须可用。它们都不是成为组合框之外的东西。没有足够的屏幕房地产。

+14

**为什么**你想用一个装满** 12'000 **条目的组合框折磨你的顾客!?!?这是疯了.....你需要找到另一种方式向顾客展示这种选择... – 2010-12-22 20:20:59

+0

它需要3 *分钟*我假设? – 2010-12-22 20:21:39

+1

您是否尝试过调用BeginUpdate和EndUpdate? – ComputerSaysNo 2010-12-22 20:21:49

回答

1

一些选项。

1. /你真的需要填写12000项?你可以使用一些过滤方案,只返回该数据的一个子集?

2. /你必须使用组合框吗?你有屏幕房地产使用虚拟列表视图,而不是? (自己处理存储和分页)

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

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

据我所知,没有模式可以让你使用dev express(或native)组合框来执行此操作。

7

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

0

老实说,三秒钟听起来很不错,用于将12000条记录加载到这样的控件中。

下拉菜单是否必须从TdxfCustomComboBox下降?我认为你最好在这里滚动你自己的组合框控件,根据需要翻页相关的数据集,而不是预先加载所有的字符串。理想情况下,你也可以构建过滤器。

2

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

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

1

组合框和ListViews在指数曲线上体验到性能下降,成千上万的项目变得非常糟糕。只要有可能就使用虚拟列表,如果你有几千个。

1

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

1

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