0

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

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

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

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

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

4

2 回答 2

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

于 2017-04-18T16:10:13.833 回答
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 中了解所涉及的字段名。似乎这门课缺少最重要的信息。

于 2017-04-18T17:55:35.833 回答