How to search a FMX.TListView header as well as items
我有一个LiveBindings数据绑定的FMX.TListView,其FieldName为Stage,FillHeaderFieldName为Production。当应用程序运行时,我会看到使用HeaderAppearance的Productions列表,并且在每个Production中都有一个使用ItemAppearance的舞台列表。我已启用SearchVisible,以使组件搜索面板显示在列表的顶部。
当前,在搜索框中输入的内容仅在舞台上进行过滤,而不在制作中进行过滤。
我希望能够做到这两者,而且我希望能够做到这一点,而无需使用过滤器参数再次进行REST调用。我知道我可能需要为OnSearchChange事件编写一个事件处理程序,并且我有这段代码来获取输入的搜索文本:
1 2 3 4 5 6 7 8 | 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属性,并使用以下代码:
1 2 3 4 5 6 7 | 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个详细信息项目-因此我不确定为什么不使用过滤器应用于标头项目,就像处理明细项目一样。
我尝试了一下,找到了解决方案。请记住,我没有使用Delphi 10.3 Rio的权限。我正在使用10.1柏林。还请记住,我通常要做的是绑定在代码中,而不是视觉上。但是为此,我坚持视觉绑定。
作为数据集,我使用了带有2个数据字段(fmt1Prod和fmt1Stage)和1个计算字段(fmt1Search)的TFDMemoryTable(mt1)。我有以下处理程序来计算"搜索"字段:
1 2 3 4 | Procedure TForm2.mt1CalcFields(DataSet: TDataSet); Begin fmt1Search.AsString := fmt1Prod.AsString + '|' + fmt1Stage.AsString; End; |
我在内存表OnFormCreate中放入了一些随机数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Procedure TForm2.FormCreate(Sender: TObject); Var i1, i2: Integer; s1, s2: String; Begin mt1.CreateDataSet; For i1 := 1 To 13 Do Begin s1 := 'Prod' + FormatFloat('00', i1); For i2 := Random(6) To Random(14) Do Begin s2 := 'Stage' + FormatFloat('00', i2); mt1.Append; fmt1Prod.AsString := s1; fmt1Stage.AsString := s2; mt1.Post; End; End; End; |
我在Form2上放了一个TGrid和一个TListView。两者都绑定到数据集。数据和计算字段正确显示在TGrid中(仅供检查)。
TListView绑定到数据集,如下所示:
1 2 3 4 5 | Synch <-> * ItemHeader.Text <- Prod ItemHeader.Break <- Prod Item.Text <- Search Item.Detail <- Stage |
之所以这样做,是因为我无法找到一种方法使TListView搜索框可用于除项目文本之外的任何内容。好的...但是这可以解决:
- 将TListView.ItemAppeance设置为Custom
- 在结构中找到TListView / ItemAppearance / Item / Text对象,并将Visible设置为False
- 在结构中找到TListView / ItemAppearance / Item / Detail对象,然后将Visible设置为True
我不确定以上所有内容是否必要,但可以使用。如果您的TListView是可编辑的,那么您可能还需要摆弄ItemEditAppearance。
请记住,使用自定义项外观,您实际上可以将列表视图项设置为无论您想要什么都可以看起来。您可以添加和删除标签,图像等。它不像设计表单那样强大,但是您可以做很多事情。但是,您真正需要的是隐藏搜索文本,并在项目中的某处显示阶段文本。
而且...为了使商品外观更精致,您可能必须进行一些代码绑定(尽管不能确定)。
如果使用可视绑定和ItemAppearance(动态外观),则可以将数据源中的一列分配给标题和文本项(visible = false)。在这种情况下,标题和项目中的值相同,并且搜索工作正常。