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组件,但这个问题没有出现。另一个解决方法是使用2
TFDMemTable
,一个用于删除不需要的记录,另一个用于显示(使用LiveBindings),然后使用gng
CopyDataSet
将过程数据集复制到显示数据集中。这正在工作(我们必须
。在取消运行
CopyDataSet
之前关闭显示数据集)。