Listview 如何在FireMonkey中调用数据感知(实时绑定)组件的刷新?
我有一个Listview 如何在FireMonkey中调用数据感知(实时绑定)组件的刷新?,listview,delphi,firemonkey,firedac,livebindings,Listview,Delphi,Firemonkey,Firedac,Livebindings,我有一个TListView,在LiveBindings中与TFDMemTable链接。我使用LoadFromFile在FDMemTable中加载数据(例如,我有20条记录) 当我从FDMemTable中删除一条记录时,RecordCount会减少,但TListView不会刷新,它会继续显示加载在LoadFormFile上的20条记录 如果使用FDMemTable:I.SaveToFile,关闭,然后使用重新加载.LoadFromFile,则列表视图现在显示更改 如果我使用FDMemTable的C
TListView
,在LiveBindings中与TFDMemTable
链接。我使用LoadFromFile
在FDMemTable中加载数据(例如,我有20条记录)
当我从FDMemTable中删除一条记录时,RecordCount
会减少,但TListView
不会刷新,它会继续显示加载在LoadFormFile
上的20条记录
如果使用FDMemTable:I.SaveToFile
,关闭
,然后使用重新加载.LoadFromFile
,则列表视图现在显示更改
如果我使用FDMemTable的CachedUpdate
,这是相同的行为
我已尝试调用TFDMemTable.Refresh
和TListView.Repaint
,但未成功
是否可以调用TListView
刷新他的“链接”数据集
当我删除FDMemTable中的记录时,为什么在TListView
上没有可见的刷新
编辑:
我必须添加一个东西,记录是以编程方式删除的
所需的功能是删除FDMemTable
中的一条不需要的记录,并使用TListView
向用户显示剩余的记录。这里的livebindings并不总是双向的。ListView livebindings设计用于从UI到数据集的方向,但仅限于大部分
如果您启用了CanSwipeDelete
,如果您知道如何操作的话,您可以期望它能够工作
在我的例子中,在Android上,我发现自己在编写代码以确保listview与数据集保持同步,即使有活动的LiveBinding。在我的例子中,是一个名为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;
procedure TfrmLiveMain.ListView1DeleteingItem(发送方:ToObject;AIndex:Integer;
var ACanDelete:布尔值);
变量
LI:TListViewItem;
LIO:TListItemText;
开始
//如果没有,请检查livebindings是否正在执行其任务
//我自己做
ACanDelete:=假;
LI:=ListView1.Items[AIndex];
LIO:=LI.Objects.findobject('Text1');
FTagID:=LIO.Text;
如果ClientModule2.CDSAnimals.FieldByName('TagID').AsString FTagID,则
ClientModule2.CDSAnimals.Locate('TagID',FTagID,[]);
如果ClientModule2.CDSAnimals.FieldByName('TagID').AsString=FTagID,则
开始
ACanDelete:=真;//导致删除listview项而不删除
//影响相应的数据集记录
结束;
结束;
过程TfrmLiveMain.ListView1DeleteItem(发送方:ToObject;AIndex:Integer);
开始
//这是用错误的索引调用的!
如果ClientModule2.CDSAnimals.Locate('TagID',FTagID,[]),则
如果ClientModule2.CDSAnimals.FieldByName('TagID').AsString=FTagID,则
开始
//现在也删除相应的记录
ClientModule2.CDSAnimals.Delete;//而且它有效!
结束;
结束;
在LiveBindings Designer中,通过将列表视图的同步
链接到FDMemTable的*
,现在列表视图
显示结果记录
同样在我的上一个算法中,因为我使用.BeginBatch/.EndBatch
(禁用数据感知刷新),在处理数据以删除不需要的记录时,我必须暂时禁用LiveBinding链接(因为我在处理数据时使用不同的排序索引):LinkListControlToField1.Active:=false代码>并在处理后“重新链接”它:LinkListControlToField1.Active:=true代码>@Fabrizio:嗯?live Binding的全部思想不是能够在数据集中使用不支持db的组件吗?@MartynA Ops,我误读了,很抱歉你的想法让我想到了一个可能的解决方法:删除TListView
的item对象,同时删除TFDMemTable
中的记录。我不知道这是否是Delphi中的一个bug,但我尝试了一些TMS组件,但这个问题没有出现。另一个解决方法是使用2TFDMemTable
,一个用于删除不需要的记录,另一个用于显示(使用LiveBindings),然后使用gngCopyDataSet
将过程数据集复制到显示数据集中。这正在工作(我们必须。在取消运行CopyDataSet
之前关闭显示数据集)。