【问题标题】:Filter database table/query whilst typing in TEdit box在编辑框中键入时过滤数据库表/查询
【发布时间】:2015-05-28 14:56:10
【问题描述】:

我有一个表单,上面有一个 cxGrid,并通过 TADQuery (FireDAC) 连接到数据库表。

我还在同一个表单中添加了一个 TEdit 框。当用户开始在 TEdit 框中输入内容时,我是否可以让网格开始根据用户输入的内容过滤结果(最好是表格中的多个字段)?

如果是这样,您的想法/示例将不胜感激。 谢谢。

【问题讨论】:

  • 你知道 cxGrid 有内置的过滤支持吗?

标签: delphi delphi-xe2 firedac


【解决方案1】:

在您的FDQuery 中,您可能会有这样的查询:

SELECT * FROM MyTable
WHERE ColumnA LIKE :paramA

这适用于字符串列,但任何其他逻辑比较都可以。我想您知道如何编写查询。

您当然需要以编程方式或通过设计时对象检查器中的Parameters 属性添加参数,确保参数名称与查询中使用的名称相匹配。我还假设您知道如何执行此操作。

TEditOnChange 处理程序中,您可以执行以下操作:

procedure TForm1.Edit1Change(Sender: TObject);
begin
  FDQuery1.Params.ParamByName('paramA').Value := Format('%%%s%%',[Edit1.Text]);
  FDQuery1.Refresh;
end;

这自然会用% SQL 通配符将搜索词括起来,从而将返回的记录缩小到包含用户在编辑框中键入的子字符串的记录。

如果您正在查询一个大型数据集,其中 .Refresh 操作长时间运行,您可以改为使用计时器来延迟刷新数据集,直到用户在给定的时间间隔内停止输入。

【讨论】:

  • 非常感谢您的回答
【解决方案2】:

使用 TEdit 字段中的 KeyDown 事件来启动计时器。使用 Timer-Event,您可以检查文本是否仍在更改(用户仍在键入) - 可能为 500 毫秒的计时器的间隔 - 1 sek 在检查之间就足够了。 如果在此期间文本没有更改,则使用编辑字段中的文本重新查询您的 cxGrid。最重要的是,您可以使用线程重新查询您的网格。 用户键入的速度越慢,您查询的表越大,您的时间间隔就应该越长。

【讨论】:

    【解决方案3】:

    更好地使用过滤器

    procedure TForm4.Edit1Change(Sender: TObject);
    begin
     if trim(edit1.Text)>'' then
     begin
       adoquery1.Filter:='field1 like '+quotedstr(trim(edit1.Text)+'%');
       adoquery1.Filtered:=true
     end
     else      adoquery1.Filtered:=false
    

    结束;

    【讨论】:

    • 如果参数化查询(如已接受的答案)仅检索大表中一小部分行,则不一定更好。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多