【发布时间】:2019-12-30 03:52:55
【问题描述】:
我有一个 LiveBindings 数据绑定 FMX.TListView,其中 FieldName 为 Stage,FillHeaderFieldName 为 Production。当应用程序运行时,我会看到一个使用 HeaderAppearance 的 Productions 列表,并且在每个 Production 中,都有一个使用 ItemAppearance 的 Stages 列表。我已打开 SearchVisible 以使组件搜索面板显示在列表顶部。
目前,在搜索框中输入内容仅过滤舞台,而不是制作。
我希望能够同时做到这两个,并且我希望能够做到这一点,而无需使用过滤器参数进行另一个 REST 调用。我知道我可能需要为 OnSearchChange 事件编写一个事件处理程序,并且我有这段代码来获取输入的搜索文本:
List := Sender as TListView;
for I := 0 to List.Controls.Count-1 do
if List.Controls[I].ClassType = TSearchBox then
begin
SearchBox := TSearchBox(List.Controls[I]);
break;
end;
我认为我需要设置 Items.Filter 属性,我使用了这段代码:
Lower := LowerCase(SearchBox.Text.Trim);
List.Items.Filter :=
function(X: string): Boolean
begin
Result:= (Lower = EmptyStr) or LowerCase(X).Contains(Lower);
end;
其中一个问题是 ListView 组件在输入字符后立即应用其过滤,而 OnSearchChange 事件仅在搜索框失去焦点时触发。
第二个问题是,即使在事件被触发并设置了新的过滤器函数之后,列表也没有任何反应。
我已经确认我的“36”示例中的 List.Items 集合确实包含所有 6 个项目 - 3 个标题项目和 3 个详细项目 - 所以我不确定为什么过滤器不适用于标题项目,因为它适用于详细信息项目。
【问题讨论】:
-
我想我已经完成了您正在寻找的事情,但我找不到代码。我向数据集添加了一个计算字段,该字段连接了我想要过滤列表视图的所有字段(使用不可能的分隔符,如管道字符)。然后我将该字段绑定到列表视图以进行搜索。列表视图实际上有一个自定义布局,其中有几个字段位于不同的位置、字体、大小等......但我想过滤所有这些。但用于搜索 IIRC 的字段不一定要显示。
-
@Frazz。谢谢。我会试一试的。添加一个包含 Production 和 Stage 文本的隐藏字段,然后将其设置为搜索字段...如果我知道该怎么做的话。我只能推测内置搜索仅适用于在 LiveBindings 下选择为 FieldName 的任何内容(或查看 Bind Visually 图表时的 Item.Text ...)
-
好吧。在这方面没有取得任何进展。找不到有关如何在任何字段上进行 LiveBindings TListView 搜索的任何文档,除了为项目选择的字段。我什至不能向 Embarcadero 寻求开发支持,因为他们只是把我送到他们的 Idera 社区论坛(我也发过帖子)。我想我最终可能不得不删除 Live Bindings 并手动填充 TListView,但这会慢很多。
标签: delphi firemonkey delphi-10.3-rio