FMX.TGrid 如何允许用户移动列而不弄乱数据

FMX.TGrid how to allow user to move columns without messing up the data

我在 Delphi 10.2 中使用 FMX 做了一个非常简单的测试项目。 设置很简单:

一切正常,TGrid 中填充了 XML 文件中的所有记录。 XML 文件是由旧项目中的另一个 TClientDataSet 创建的。

现在正题。
当我将一列移动到另一个位置时,所有数据都被弄乱了。为此,我只需在一列上按住鼠标,然后将其向右拖动几列。
起初它看起来不错,但是当您开始垂直滚动时,数据似乎不再位于正确的列中。
我感觉它只会更正网格可视部分中的数据,一旦您开始滚动,数据就不再位于正确的列中。

这是已知错误还是我的项目有问题。
正如我之前所说,这个项目中绝对没有代码,所有代码都在设计器中完成。 (clientdataset1.LoadFromFile 场外除外)

您可以尝试手动填充数据 (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;

然后你可以使用我的列解决方案:

这对我来说已经解决了。 我只是将在网格中移动的字段也移动到 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 中了解涉及哪个字段名。 class.

中似乎缺少最重要的信息