在编辑框中键入时筛选数据库 table/query

Filter database table/query whilst typing in TEdit box

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

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

如果是这样,您的 thoughts/examples 将不胜感激。 谢谢

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

在您的 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 操作是 long-运行 您可以改为使用计时器来延迟刷新数据集,直到用户在给定的时间间隔内停止输入时间.

更好地使用过滤器

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

结束;