FireMonkey中如何调用data-aware(live-binding)组件的刷新?
How to call the refreshing of data-aware (live-binding) component in FireMonkey?
我有一个 TListView
在 LiveBindings 中与 TFDMemTable
链接。我使用 LoadFromFile
在 FDMemTable 中加载数据(例如,我有 20 条记录)。
当我从FDMemTable中删除一条记录时,RecordCount
减少了,但TListView
没有刷新,它继续显示LoadFormFile
上加载的20条记录。
如果使用 FDMemTable:我 .SaveToFile
、.Close
并使用 .LoadFromFile
重新加载,TListView
现在会显示更改。
无论是否使用 FDMemTable 的 CachedUpdate
,这都是相同的行为。
我已经尝试调用 TFDMemTable.Refresh
和 TListView.Repaint
但没有成功。
是否可以调用 TListView
来刷新他的 "linked" 数据集?
当我删除 FDMemTable 中的一条记录时,为什么 TListView
上没有出现可见的刷新?
编辑:
我必须添加一件事,以编程方式删除记录。
所需的功能是删除 FDMemTable
中不需要的记录,并使用 TListView
向用户显示剩余记录。
这里的实时绑定并不是始终双向的。 ListView 实时绑定旨在从 UI 到数据集方向工作,但仅在大多数情况下。
如果您启用 CanSwipeDelete
,如果您知道如何操作,您可以预期它会起作用。
就我而言,在 Android,我发现自己正在编写代码以确保列表视图与数据集保持同步,即使实时绑定处于活动状态。在我的例子中是一个名为 CDSAnimals 的 TClientDataset,具有唯一键值 TagID。希望对您有所帮助。
procedure TfrmLiveMain.ListView1DeletingItem(Sender: TObject; AIndex: Integer;
var ACanDelete: Boolean);
var
LI: TListViewItem;
LIO: TListItemText;
begin
// check that the livebindings is doing it's job, if not
// do it myself
ACanDelete := False;
LI := ListView1.Items[AIndex];
LIO := LI.Objects.FindObjectT<TListItemText>('Text1');
FTagID := LIO.Text;
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString <> FTagID then
ClientModule2.CDSAnimals.Locate('TagID', FTagID, []);
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
begin
ACanDelete := True; // causes the listview item to be deleted without
// affecting the corresponding dataset record
end;
end;
procedure TfrmLiveMain.ListView1DeleteItem(Sender: TObject; AIndex: Integer);
begin
// this is called with the wrong index!
if ClientModule2.CDSAnimals.Locate('TagID', FTagID, []) then
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
begin
// now delete the corresponding record too
ClientModule2.CDSAnimals.Delete; // and it works!
end;
end;
在 LiveBindings Designer 中,通过 link 将 ListView
的 Synch
转换为 FDMemTable
的 *
,ListView
现在显示结果记录。
同样在我的最后一个算法中,因为我使用 .BeginBatch / .EndBatch
(禁用数据感知刷新),在处理数据以删除不需要的记录时我必须暂时禁用 LiveBinding link(原因我在处理数据时使用不同的排序索引):LinkListControlToField1.Active := false;
和 "re-link" 处理后:LinkListControlToField1.Active := true;
我有一个 TListView
在 LiveBindings 中与 TFDMemTable
链接。我使用 LoadFromFile
在 FDMemTable 中加载数据(例如,我有 20 条记录)。
当我从FDMemTable中删除一条记录时,RecordCount
减少了,但TListView
没有刷新,它继续显示LoadFormFile
上加载的20条记录。
如果使用 FDMemTable:我 .SaveToFile
、.Close
并使用 .LoadFromFile
重新加载,TListView
现在会显示更改。
无论是否使用 FDMemTable 的 CachedUpdate
,这都是相同的行为。
我已经尝试调用 TFDMemTable.Refresh
和 TListView.Repaint
但没有成功。
是否可以调用 TListView
来刷新他的 "linked" 数据集?
当我删除 FDMemTable 中的一条记录时,为什么 TListView
上没有出现可见的刷新?
编辑: 我必须添加一件事,以编程方式删除记录。
所需的功能是删除 FDMemTable
中不需要的记录,并使用 TListView
向用户显示剩余记录。
这里的实时绑定并不是始终双向的。 ListView 实时绑定旨在从 UI 到数据集方向工作,但仅在大多数情况下。
如果您启用 CanSwipeDelete
,如果您知道如何操作,您可以预期它会起作用。
就我而言,在 Android,我发现自己正在编写代码以确保列表视图与数据集保持同步,即使实时绑定处于活动状态。在我的例子中是一个名为 CDSAnimals 的 TClientDataset,具有唯一键值 TagID。希望对您有所帮助。
procedure TfrmLiveMain.ListView1DeletingItem(Sender: TObject; AIndex: Integer;
var ACanDelete: Boolean);
var
LI: TListViewItem;
LIO: TListItemText;
begin
// check that the livebindings is doing it's job, if not
// do it myself
ACanDelete := False;
LI := ListView1.Items[AIndex];
LIO := LI.Objects.FindObjectT<TListItemText>('Text1');
FTagID := LIO.Text;
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString <> FTagID then
ClientModule2.CDSAnimals.Locate('TagID', FTagID, []);
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
begin
ACanDelete := True; // causes the listview item to be deleted without
// affecting the corresponding dataset record
end;
end;
procedure TfrmLiveMain.ListView1DeleteItem(Sender: TObject; AIndex: Integer);
begin
// this is called with the wrong index!
if ClientModule2.CDSAnimals.Locate('TagID', FTagID, []) then
if ClientModule2.CDSAnimals.FieldByName('TagID').AsString = FTagID then
begin
// now delete the corresponding record too
ClientModule2.CDSAnimals.Delete; // and it works!
end;
end;
在 LiveBindings Designer 中,通过 link 将 ListView
的 Synch
转换为 FDMemTable
的 *
,ListView
现在显示结果记录。
同样在我的最后一个算法中,因为我使用 .BeginBatch / .EndBatch
(禁用数据感知刷新),在处理数据以删除不需要的记录时我必须暂时禁用 LiveBinding link(原因我在处理数据时使用不同的排序索引):LinkListControlToField1.Active := false;
和 "re-link" 处理后:LinkListControlToField1.Active := true;