FMX.TGrid 如何允许用户移动列而不弄乱数据
FMX.TGrid how to allow user to move columns without messing up the data
我在 Delphi 10.2 中使用 FMX 做了一个非常简单的测试项目。
设置很简单:
- 绑定到 TClientDataSet 的 TGrid(在设计器中完成)。
- 允许用户打开 XML 文件的按钮
一切正常,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.
中似乎缺少最重要的信息
我在 Delphi 10.2 中使用 FMX 做了一个非常简单的测试项目。 设置很简单:
- 绑定到 TClientDataSet 的 TGrid(在设计器中完成)。
- 允许用户打开 XML 文件的按钮
一切正常,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.
中似乎缺少最重要的信息