FMX.TGrid, как позволить пользователю перемещать столбцы, не путая данные
Я сделал очень простой тест-проект в Delphi 10.2 с использованием FMX. Настройка проста:
- TGrid, который привязан к TClientDataSet (сделано в дизайнере).
- кнопка, которая позволяет пользователю открыть файл XML
Все это прекрасно работает, и TGrid заполняется всеми записями из XML-файла. Файл XML создается другим TClientDataSet из более старого проекта.
Теперь о проблеме.
Когда я перемещаю столбец в другую позицию, все данные портятся. Я делаю это, просто удерживая мышь на столбце, а затем перетаскивая его на несколько столбцов вправо.
Сначала это выглядит хорошо, но когда вы начинаете прокручивать по вертикали, кажется, что данные больше не находятся в правильных столбцах.
У меня такое ощущение, что он только корректирует данные в визуальной части сетки, и как только вы начинаете прокручивать данные, они больше не попадают в правильные столбцы.
Это известная ошибка или что-то не так с моим проектом.
Как я уже говорил, в этом проекте нет абсолютно никакого кода, все сделано в конструкторе. (за исключением клиента clientdataset1.LoadFromFile)
2 ответа
Это исправило это для меня. Я просто перемещаю поля, которые были перемещены в сетке также в ClientDataSet, и до сих пор, кажется, это работает.
procedure TForm1.Grid1ColumnMoved(Column: TColumn; FromIndex, ToIndex: Integer);
var
FieldFrom : string;
FieldTo : string;
begin
FieldFrom := Grid1.ColumnByIndex(FromIndex).Header;
FieldTo := Grid1.ColumnByIndex(ToIndex).Header;
ClientDataSet1.FieldByName(FieldFrom).Index := FromIndex;
ClientDataSet1.FieldByName(FieldTo).Index := ToIndex;
end;
Но я просто хотел бы, чтобы был лучший способ узнать из TColumn, какое имя поля задействовано. Похоже, самая важная информация отсутствует в этом классе.
Вы можете попробовать заполнить ваши данные вручную (Grid: TGrid; CDS: TClientDataSet
):
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
Col: TColumn;
begin
CDS.Active := True;
for I := 0 to CDS.FieldDefs.Count - 1 do begin
Col := TColumn.Create(Grid);
Grid.AddObject(Col);
Col.Header := CDS.FieldDefs[I].Name;
Col.Tag := I;
end;
Grid.RowCount := CDS.RecordCount;
end;
procedure TForm1.GridGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue);
begin
CDS.First;
CDS.MoveBy(ARow);
Value := CDS.Fields[ACol].Text;
end;
И после этого вы можете использовать мое решение для столбцов: /questions/20692741/fmx-tgrid-ongetvalue-posle-peremescheniya-stolbtsa