我有一个表格,上面有一个cxGrid,并通过TADQuery(FireDAC)连接到数据库表。
我还在同一个表单中添加了一个TEdit框。当用户开始在TEdit框中输入内容时,我是否可以根据用户输入的内容(最好是表格中的多个字段)开始网格过滤?
如果是这样,您的想法/示例将不胜感激。 感谢。
答案 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
端;