在编辑框中键入时筛选数据库 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
属性 添加参数,确保参数名称与在询问。我还假设您知道该怎么做。
然后,在 TEdit
的 OnChange
处理程序中,您可以执行以下操作:
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
结束;
我有一个表格,上面有一个 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
属性 添加参数,确保参数名称与在询问。我还假设您知道该怎么做。
然后,在 TEdit
的 OnChange
处理程序中,您可以执行以下操作:
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
结束;