如何搜索 FMX.TListView header 以及项目
How to search a FMX.TListView header as well as items
我有一个 LiveBindings 数据绑定 FMX.TListView,FieldName 是 Stage,FillHeaderFieldName 是 Production。当应用程序为 运行 时,我会看到一个使用 HeaderAppearance 的作品列表,并且在每个作品中,都有一个使用 ItemAppearance 的阶段列表。我已打开 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 collection 实际上包含所有 6 项 - 3 header 项目和 3 个细节项目 - 所以我不确定为什么过滤器没有像应用细节项目那样应用于 header 项目。
我尝试了这个并找到了解决方案。请记住,我无法访问 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;
我在内存中放了一些随机数据table 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.ItemAppeance设置为自定义
- 在结构中找到 TListView/ItemAppearance/Item/Text 对象并将 Visible 设置为 False
- 在结构中找到TListView/ItemAppearance/Item/Detail对象并将Visible设置为True
我不确定以上所有内容是否必要,但它确实有效。如果您的 TListView 是 editable 那么您可能也需要 fiddle 和 ItemEditAppearance。
请记住,使用自定义项目外观,您实际上可以将列表视图项目设置为您想要的任何外观。您可以添加和删除标签、图像和其他内容。它不如设计表单那么强大,但是您可以用它做很多事情。但您真正需要的是隐藏搜索文本并在项目的某处显示阶段文本。
并且...对于更复杂的项目外观,您可能需要进行一些代码绑定(虽然不确定)。
如果使用视觉绑定和 ItemAppearance(动态外观),您可以将数据源中的一列分配给 header 和文本项(visible = false)。在这种情况下 header 和 item 我们有相同的值并且搜索工作正常。
我有一个 LiveBindings 数据绑定 FMX.TListView,FieldName 是 Stage,FillHeaderFieldName 是 Production。当应用程序为 运行 时,我会看到一个使用 HeaderAppearance 的作品列表,并且在每个作品中,都有一个使用 ItemAppearance 的阶段列表。我已打开 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 collection 实际上包含所有 6 项 - 3 header 项目和 3 个细节项目 - 所以我不确定为什么过滤器没有像应用细节项目那样应用于 header 项目。
我尝试了这个并找到了解决方案。请记住,我无法访问 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;
我在内存中放了一些随机数据table 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.ItemAppeance设置为自定义
- 在结构中找到 TListView/ItemAppearance/Item/Text 对象并将 Visible 设置为 False
- 在结构中找到TListView/ItemAppearance/Item/Detail对象并将Visible设置为True
我不确定以上所有内容是否必要,但它确实有效。如果您的 TListView 是 editable 那么您可能也需要 fiddle 和 ItemEditAppearance。
请记住,使用自定义项目外观,您实际上可以将列表视图项目设置为您想要的任何外观。您可以添加和删除标签、图像和其他内容。它不如设计表单那么强大,但是您可以用它做很多事情。但您真正需要的是隐藏搜索文本并在项目的某处显示阶段文本。
并且...对于更复杂的项目外观,您可能需要进行一些代码绑定(虽然不确定)。
如果使用视觉绑定和 ItemAppearance(动态外观),您可以将数据源中的一列分配给 header 和文本项(visible = false)。在这种情况下 header 和 item 我们有相同的值并且搜索工作正常。