Как вызвать обновление компонента с поддержкой данных (динамическое связывание) в FireMonkey? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть TListView, связанный в LiveBindings с TFDMemTable. Я загружаю данные в FDMemTable, используя LoadFromFile (у меня есть, например, 20 записей).

Когда я удаляю запись из FDMemTable, RecordCount уменьшается, но TListView не обновляется, он продолжает отображать 20 записей, загруженных на LoadFormFile.

Если с помощью FDMemTable: I .SaveToFile, .Close и перезагрузить с помощью .LoadFromFile, TListView теперь отображает изменение.

Это то же самое поведение, если я использую CachedUpdate FDMemTable или нет.

Я пытался дозвониться до TFDMemTable.Refresh и TListView.Repaint без успеха.

Можно ли вызвать TListView, чтобы обновить его "связанный" набор данных?

Когда я удаляю запись в FDMemTable, почему на TListView?

не происходит видимого обновления

EDIT: Надо добавить вещь, запись удаляется программно.

Желаемая функциональность - удалить ненужную запись в FDMemTable и отобразить оставшуюся запись пользователю с помощью TListView.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

В LiveBindings Designer, связав Synch из ListView с * из FDMemTable, ListView теперь отображает результирующую запись.

LiveBindings Designer

Также в моем последнем алгоритме, потому что я использую .BeginBatch / .EndBatch (который отключает обновление с учетом данных), при обработке данных для удаления нежелательной записи я должен временно отключить ссылку LiveBinding (потому что я использую другой индекс сортировки во время обработки данных): LinkListControlToField1.Active := false; и «перекомпоновать» его после обработки: LinkListControlToField1.Active := true;

0 голосов
/ 07 ноября 2018

Живые привязки здесь не всегда двунаправлены. Живые привязки ListView были разработаны для работы от пользовательского интерфейса в направлении набора данных, но только в основном.

Если вы включите CanSwipeDelete, вы можете ожидать, что это сработает, если вы знаете, как.

В моем случае на Android я обнаружил, что пишу код, чтобы гарантировать, что просмотр списка синхронизируется с набором данных, даже если активная привязка активна. В моем случае это TClientDataset с именем CDSAnimals, с уникальным значением ключа 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;
...