我设法通过TEdit创建一个“搜索”栏,从内部搜索我输入的内容 一个ListView,它从DataBase获取其信息并通过一个过滤器,并在按下一个键后动态更新ListView的项目。
现在我正在尝试学习如何实现一种限制我在ListView中暂时获得的结果的方法,直到我按下Show More按钮或类似的东西,以获得更相关的结果。
由于数据库在按“A”时可能会返回超过500个结果,这对手机的功能来说会很苛刻,所以我需要这个功能才能使我的搜索按钮更有效率。
有人可以给我一些指示,说明我可以使用什么来制作类似的东西吗?
EDIT。
我用于在ListView中搜索的当前代码是这个......
procedure TContactsForm.Edit1ChangeTracking(Sender: TObject);
var
Lower: string;
i: integer;
begin
Lower:= LowerCase(Edit1.Text.Trim);
if Lower= '' then
begin
if Filtered then
begin
ListView1.Items.Filter := nil;
ListView1.ItemIndex := BindSourceDB1.ComponentIndex;
end;
end
else
begin
ListView1.ItemIndex := -1;
ListView1.Items.Filter :=
function(X: string): Boolean
begin
Result:= (Lower = EmptyStr) or LowerCase(X).Contains(Lower);
end;
end;
end;
function TContactsForm.Filtered: Boolean;
begin
Result := Assigned(ListView1.Items.Filter);
end;
答案 0 :(得分:0)
最简单的方法是对select语句进行建模,使其仅返回有限的行数(您可以随时根据用户请求删除限制)。
对于SQLite,MySQL和PostgreSQL,您使用LIMIT
子句:
SELECT acolumn FROM atable WHERE afield LIKE :param LIMIT 4;
在SQL Server中,您必须执行以下操作:
SELECT * FROM (
SELECT column, ROW_NUMBER() OVER (ORDER BY name) as row FROM atable
) a WHERE a.row <= 4
这具有额外的好处,即数据库生成和传输的数据更少。
在进行完整搜索时,您只需省略限制条款。
如果您想保留已有的结果并添加额外的结果,请使用
LIMIT 20 OFFSET 5
子句(没有offset关键字,操作数被反转LIMIT 5,20
)
你总是想限制,以使体验活泼
每个新页面,您都会获取下一个x记录。
您甚至可以实时执行此操作,因为用户正在向下滚动列表 当他接近列表的底部时获取新记录。