在组合框中列出搜索结果

时间:2010-08-04 06:05:29

标签: sql delphi devexpress delphi-2007 interbase

我想改变我们的搜索,因为它现在有点hacky。 目前它的工作原理如下:

  1. 用户在文本框中输入文字,例如 Volvo 并开始搜索。
  2. 使用SQL搜索包含沃尔沃的所有帖子。
  3. 结果是一个包含2列的列表,BoldID和DisplayValue。
  4. BoldID只是用于标识数据库中对象的唯一编号。
  5. DisplayValue是用户在结果列表中看到的内容。
  6. 结果集中的每一行都标有用户列表中的行号。第一个是1,第二个是2,依此类推。
  7. 还有一个限制,即只通过在代码中循环查询来显示最多99次点击。有一个返回许多命中的查询是不好的,因为在用户命中列表中没有更多含义。在这种情况下,搜索应该更具体。
  8. 结果列表显示在名为rightpane的单独全局窗口中。 hacky部分是,如果从模态对话框中搜索,则必须从主窗口取消右侧窗格以便能够使用鼠标选择值。我们怀疑这可能是应用程序有时会锁定主窗口后面的模式对话框的原因。

    更改后应该像这样工作:

    用户在Combobox中输入文本,并像以前一样开始按需搜索SQL。但结果集显示在组合框中。所以我只想在可能的情况下更改显示,因为有很多旧的SQL查询正在使用并且现在正常工作。

    我们使用Delphi 2007,Interbase 2009和DevExpress的组件。昨天我尝试将customdatasource连接到组合框,但我意识到这还没有实现。见How to use a TcxCustomDataSource in a TcxExtLookupComboBox。我想使用自定义数据源来实现行数和最大命中数。上面列表中的Se 6和7。

    现在我看到两个选项:

    • 使用支持DB的组合框
    • 使用文本框并为其附加网格以显示结果集。

    组合框更简单,因为它是一个完整的组件,但我不知道如何从上面的列表中实现功能6和7。 文本框+网格提供了更多自由,但需要更多工作。

    我更喜欢第一种选择。目前的问题是:

    • 我认为Interbase SQL无法限制结果集中的匹配数量。必须用代码完成。如何使用支持DB的组合框来完成这项工作?
    • 如何在结果集中显示行号?

    更新1: 感谢Marjan解决了要求7的问题。 至于6我觉得它更难。理想情况下,我希望它在SQL中,所以我可以提取像Adding row no这样的自己的列。但Interbase不支持这一点。

2 个答案:

答案 0 :(得分:3)

要求6:

假设db的id值是一个整数,你可以使用控件的标签或组合框/列表框中字符串的Object来存储id值。

[伪代码]

while not eof do
  ComboBox.Items.AddObject(<DisplayText From Db>, TObject(<IntegerID from Db>));

并像这样使用

id := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);

要求7:

使用数据库感知组合框/列表框循环查询直到eof或99行。所以你需要依赖SQL。即使您不想更改任何当前的SQL语句,也可以使用SQL的“TOP”功能来限制行数。例如

SELECT TOP 99 FROM (<your original SQL>)

在Interbase SQL中,您可以使用短语:

ROWS 1 TO 99 

在订单子句之后(参见http://blogs.teamb.com/craigstuntz/dtpostname/ibsqlintro/的示例 - 几乎是页面的底部)

答案 1 :(得分:2)