如何调用FireMonkey中的数据感知(实时绑定)组件的刷新?

时间:2018-11-07 03:52:43

标签: listview delphi firemonkey firedac livebindings

我有一个TListView在LiveBindings中链接了一个TFDMemTable。我使用LoadFromFile将数据加载到FDMemTable中(例如,我有20条记录)。

当我从FDMemTable删除记录时,RecordCount减少了,但TListView没有刷新,它继续显示LoadFormFile上加载的20条记录。

如果使用FDMemTable:I .SaveToFile.Close,并用.LoadFromFile重新加载,则TListView现在将显示更改。

无论我是否使用FDMemTable的CachedUpdate,这都是相同的行为。

我尝试不成功地致电TFDMemTable.RefreshTListView.Repaint

是否可以调用TListView刷新他的“链接”数据集?

当我删除FDMemTable中的记录时,为什么TListView上没有可见的刷新?

编辑: 我必须添加一个东西,以编程方式删除记录。

所需的功能是删除FDMemTable中的不想要的记录,并用TListView向用户显示剩余的记录。

2 个答案:

答案 0 :(得分:3)

在LiveBindings Designer中,通过将Synch的{​​{1}}链接到ListView的{​​{1}},*现在显示结果记录。

LiveBindings Designer

在我的最后一个算法中,由于我使用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;