Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在TEdit框中键入时筛选数据库表/查询_Delphi_Delphi Xe2_Firedac - Fatal编程技术网

Delphi 在TEdit框中键入时筛选数据库表/查询

Delphi 在TEdit框中键入时筛选数据库表/查询,delphi,delphi-xe2,firedac,Delphi,Delphi Xe2,Firedac,我有一个表单,上面有一个cxGrid,并通过TADQuery(FireDAC)连接到一个数据库表 我还向同一表单添加了一个TEdit框。当用户开始在TEdit框中键入内容时,我是否可以让网格开始根据用户键入的内容过滤结果(最好是针对表中的多个字段) 如果是这样,我们将非常感谢您的想法/示例。 谢谢。使用TEdit字段中的按键事件启动计时器。通过计时器事件,您可以检查文本是否仍在更改(用户仍在键入)-检查之间的计时器间隔可能为500毫秒-1瑞典克朗。 如果文本在此期间没有更改,请使用编辑字段中的文

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

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

如果是这样,我们将非常感谢您的想法/示例。
谢谢。

使用TEdit字段中的按键事件启动计时器。通过计时器事件,您可以检查文本是否仍在更改(用户仍在键入)-检查之间的计时器间隔可能为500毫秒-1瑞典克朗。 如果文本在此期间没有更改,请使用编辑字段中的文本重新查询cxGrid。除此之外,您还可以使用线程重新查询网格。
用户类型越慢,查询的表越大,间隔就应该越长

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

SELECT * FROM MyTable
WHERE ColumnA LIKE :paramA
这将应用于字符串列,但任何其他逻辑比较都可以。我想你知道怎么写你的查询

当然,您需要以编程方式或通过设计时对象检查器中的
Parameters
属性添加参数,确保参数名称与查询中使用的名称相匹配。我想你也知道怎么做

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

procedure TForm1.Edit1Change(Sender: TObject);
begin
  FDQuery1.Params.ParamByName('paramA').Value := Format('%%%s%%',[Edit1.Text]);
  FDQuery1.Refresh;
end;
这自然会用
%
SQL通配符将搜索词括起来,将返回的记录缩小到那些包含用户在编辑框中键入的子字符串的记录

如果查询的大型数据集的
.Refresh
操作长期运行,则可以使用计时器延迟刷新数据集,直到用户在给定的时间间隔内停止键入为止。

最好使用过滤器

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

结束

您知道cxGrid具有内置的过滤支持吗?非常感谢您的回答如果参数化查询(如接受的答案中所示)只检索大表中的一小部分行,则不一定会更好。