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

时间:2017-04-18 08:07:37

标签: delphi firemonkey tclientdataset tgrid delphi-10.2-tokyo

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

  • 绑定到TClientDataSet的TGrid(在设计器中完成)。
  • 按钮,允许用户打开XML文件

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

现在出现问题。
当我将列移动到另一个位置时,所有数据都会混乱。我这样做只需将鼠标按在一列上,然后向右拖动几列即可 起初它看起来很好,但是当你开始垂直滚动时,似乎数据不再在正确的列中 我觉得它只能纠正网格可视部分的数据,并且一旦开始滚动,数据就不再是正确的列。

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

2 个答案:

答案 0 :(得分:1)

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

在此之后,您可以将我的解决方案用于列:stackoverflow.com/q/43418528/2292722

答案 1 :(得分:1)

这为我修好了。 我只是在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有更好的方法来了解哪个字段名称。似乎这个班级缺少最重要的信息。