如何搜索FMX.TListView标头以及项目

时间:2019-08-25 21:07:08

标签: firemonkey delphi-10.3-rio

我有一个LiveBindings数据绑定的FMX.TListView,其FieldName为Stage,FillHeaderFieldName为Production。当应用运行时,我会看到使用HeaderAppearance的Productions列表,并且在每个Production中,都有使用ItemAppearance的舞台列表。我已启用SearchVisible,以使组件搜索面板显示在列表顶部。

enter image description here

当前,在搜索框中输入内容仅会在舞台上进行过滤,而不会在制作中进行过滤。

enter image description here

我希望能够做到这两者,而且我希望能够做到而又不用使用过滤器参数进行另一个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个详细信息-所以我不确定为什么过滤器不适用于明细项目,不适用于标头项目。

2 个答案:

答案 0 :(得分:2)

我尝试了一下,找到了解决方案。请记住,我无法使用Delphi 10.3 Rio。我正在使用10.1柏林。还请记住,我通常要做的是绑定在代码中,而不是视觉上。但是为此,我坚持视觉绑定。

作为数据集,我使用了带有2个数据字段(fmt1Prod和fmt1Stage)和1个计算字段(fmt1Search)的TFDMemoryTable(mt1)。我有以下处理程序来计算“搜索”字段:

Procedure TForm2.mt1CalcFields(DataSet: TDataSet);
Begin
  fmt1Search.AsString := fmt1Prod.AsString + '|' + fmt1Stage.AsString;
End;

我在内存表OnFormCreate中放入了一些随机数据:

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绑定到数据集的方法如下:

Synch            <-> *
ItemHeader.Text  <-  Prod
ItemHeader.Break <-  Prod
Item.Text        <-  Search
Item.Detail      <-  Stage

之所以这样做,是因为我无法找到一种方法使TListView搜索框可用于除项目文本之外的任何内容。好的,那...但是这可以解决:

  • 将TListView.ItemAppee设置为“自定义”
  • 在结构中找到TListView / ItemAppearance / Item / Text对象,并将Visible设置为False
  • 在结构中找到TListView / ItemAppearance / Item / Detail对象,并将Visible设置为True

我不确定以上所有内容是否必要,但是可以。如果您的TListView是可编辑的,那么您可能还需要摆弄ItemEditAppearance。

请记住,通过自定义项目外观,您实际上可以将列表视图项目设置为几乎可以根据需要进行查看。您可以添加和删除标签,图像等。它不像设计表单那样强大,但是您可以做很多事情。但是,您真正需要的只是隐藏搜索文本,并在项目中的某处显示阶段文本。

而且...为了使商品外观更精致,您可能必须进行一些代码绑定(尽管不能确定)。

答案 1 :(得分:0)

如果可视地使用绑定和ItemAppearance(动态外观),则可以将数据源中的一列分配给标题和文本项(visible = false)。在这种情况下,标题和项目的值相同,并且搜索工作正常。