在TEdit框中键入时过滤数据库表/查询

时间:2015-05-28 14:56:10

标签: delphi delphi-xe2 firedac

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

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

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

3 个答案:

答案 0 :(得分:1)

使用TEdit字段中的KeyDown事件启动计时器。使用Timer-Event检查文本是否仍在更改(用户仍在键入) - 计时器的Intervall可能为500毫秒 - 检查之间有1个sek。 如果文本在此期间没有更改,请使用编辑字段中的文本重新查询cxGrid。除此之外,您还可以使用线程来重新查询Grid。 用户输入的速度越慢,您要查询的表越长,您的实际应用时间就越长。

答案 1 :(得分:1)

.container { border: 1 px solid pink; } .height { min-height: 500px; } .flex { box-sizing: border-box; display: flex; } .flex-columns { display: flex; flex-direction: column; } .row { flex: 1; } .red { background-color: red; } .orange { background-color: orange; } .yellow { background-color: yellow; } .green { background-color: green; } .blue { background-color: blue; } .indigo { background-color: indigo; } .violet { background-color: violet; } .black { background-color: black; } .white { background-color: pink; } 中,您可能会遇到如下问题:

FDQuery

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

您当然需要以编程方式或通过设计时对象检查器中的SELECT * FROM MyTable WHERE ColumnA LIKE :paramA 属性添加参数,确保将参数的名称与查询中使用的名称相匹配。我也认为你知道如何做到这一点。

Parameters的{​​{1}}处理程序中,您可以执行以下操作:

OnChange

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

如果要查询procedure TForm1.Edit1Change(Sender: TObject); begin FDQuery1.Params.ParamByName('paramA').Value := Format('%%%s%%',[Edit1.Text]); FDQuery1.Refresh; end; 操作长时间运行的大型数据集,则可以使用计时器来延迟刷新数据集,直到用户在给定的时间间隔内停止输入为止。

答案 2 :(得分:0)

更好地使用过滤器

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

端;