我有一个TListView
在LiveBindings中链接了一个TFDMemTable
。我使用LoadFromFile
将数据加载到FDMemTable中(例如,我有20条记录)。
当我从FDMemTable删除记录时,RecordCount
减少了,但TListView
没有刷新,它继续显示LoadFormFile
上加载的20条记录。
如果使用FDMemTable:I .SaveToFile
,.Close
,并用.LoadFromFile
重新加载,则TListView
现在将显示更改。
无论我是否使用FDMemTable的CachedUpdate
,这都是相同的行为。
我尝试不成功地致电TFDMemTable.Refresh
和TListView.Repaint
。
是否可以调用TListView
刷新他的“链接”数据集?
当我删除FDMemTable中的记录时,为什么TListView
上没有可见的刷新?
编辑: 我必须添加一个东西,以编程方式删除记录。
所需的功能是删除FDMemTable
中的不想要的记录,并用TListView
向用户显示剩余的记录。
答案 0 :(得分:3)
在LiveBindings Designer中,通过将Synch
的{{1}}链接到ListView
的{{1}},*
现在显示结果记录。
在我的最后一个算法中,由于我使用FDMemTable
(禁用数据感知刷新),因此在处理数据以删除不需要的记录时,我不得不暂时禁用LiveBinding链接(因为我使用了不同的排序索引)处理数据):ListView
,并在处理之后{“ 1”重新链接“ .BeginBatch / .EndBatch
答案 1 :(得分:2)
这里的实时绑定并非始终是双向的。 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;