代码之家  ›  专栏  ›  技术社区  ›  Roland Bengtsson

在组合框中列出搜索结果

  •  2
  • Roland Bengtsson  · 技术社区  · 14 年前

    1. 例如,用户在文本框中输入文本 开始搜索。
    2. 用SQL搜索包含Volvo的所有帖子。
    3. BoldID只是标识数据库中对象的唯一数字。
    4. 结果集中的每一行都由用户列表中的行号标识。第一个是1,第二个是2,依此类推。
    5. 还有一个限制,通过在代码中循环查询,按意图只显示最大99次点击。有一个返回很多点击的查询是不好的,因为在用户点击列表中没有更多的点击是没有意义的。在这种情况下,搜索应该更加具体。

    结果列表显示在名为rightpane的单独全局窗口中。有意思的是,如果从一个模式对话框中搜索,那么rightpane必须从主窗口中移除才能用鼠标选择一个值。我们怀疑这可能是应用程序有时用主窗口后面的模式对话框锁定自己的原因。

    更改后,它应该是这样工作的:

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

    我们使用delphi2007、Interbase 2009和DevExpress的组件。昨天我尝试将customdatasource连接到combobox,但我意识到这还没有实现。看到了吗 How to use a TcxCustomDataSource in a TcxExtLookupComboBox

    现在我看到两种选择:

    • 使用DB感知组合框
    • 使用文本框并在其上附加网格以显示结果集。

    组合框更简单,因为它是一个完整的组件,但是我不知道如何实现上面列表中的功能6和7。

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

    • 我认为Interbase SQL不能限制resultset中的点击量。必须用代码来完成。如何使用DB-aware组合框实现这一点?
    • 如何在结果集中显示行号?

    更新1: 至于6,我认为更难。理想情况下,我希望它在SQL中,这样我就可以提取自己的列,如 Adding row no

    2 回复  |  直到 8 年前
        1
  •  3
  •   Marjan Venema    14 年前

    要求6:

    假设db的id值是整数,您可以使用combobox/listbox中控件的标记或字符串的对象来存储id值。

    [伪代码]

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

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

    使用db-aware组合框/listbox循环查询,直到eof或99行结束。所以您需要依赖SQL。即使您不想更改任何当前SQL语句,也可以使用SQL的“TOP”特性来限制行数。例如

    SELECT TOP 99 FROM (<your original SQL>)
    

    ROWS 1 TO 99 
    

    在order子句之后(参见 http://blogs.teamb.com/craigstuntz/dtpostname/ibsqlintro/