通过代码将数据库 table 连接到带有 LiveBindings 的 StringGrid

Connect database table to StringGrid with LiveBindings via code

我想使用 LiveBindings 将数据库 table 连接到 StringGrid,但我不想使用 LiveBindings Designer,我想通过代码手动完成。在我看来,文档几乎不存在,这使得它比应该的更复杂。

我用我的 Delphi 10.3 创建了一个 FMX 应用程序,这是我为完成所有需要而编写的代码:

procedure TForm_LiveBindings.CornerButton_Click(Sender: TObject); 
var
  aLinkTableToDataSource: TLinkGridToDataSource;
  aConnection: TADOConnection;
  aQuery: TADOQuery;
  aBindSource: TBindSourceDB;
begin
  aConnection:= TADOConnection.Create(self);
  aQuery:= TADOQuery.Create(self);
  aBindSource:= TBindSourceDB.Create(self);
  aLinkTableToDataSource:= TLinkGridToDataSource.Create(self);

  // Connection is set up here

  aQuery.Connection := aConnection;
  aQuery.SQL.Text := 'SELECT * FROM TestTable';
  aQuery.Active := True;

  aBindSource.DataSource.DataSet := aQuery;
  aBindSource.DataSource.AutoEdit := True;
  aBindSource.DataSource.Enabled := True;

  aLinkTableToDataSource.DataSource := aBindSource;
  aLinkTableToDataSource.GridControl := StringGrid1;

end;

结果:我的 StringGrid 显示 table header,但行保持为空。这意味着 table 和字符串网格之间的连接存在,列具有正确的 header,但内容未显示。那我哪里错了?

另一个问题:StringGrid 是显示我的数据库的好选择table还是有更好的解决方案?

非常感谢您的回答!

下面的示例显示了设置和填充 TStringGrid 和 TGrid 所需的所有代码 使用实时绑定。它使用 TClientDataSet 作为数据集,因此它是完全自 包含。

进行一些实验应该会让您满意,在代码中设置实时绑定实际上是 非常简单,但对步骤顺序敏感。与使用 VCL 和传统的 db-aware 控件相比,Live Bindings 似乎需要以正确的方式连接正确的东西才能正常工作。请注意,与您的代码不同,我的代码没有触及 BindSorce 的数据源 属性,因为它没有必要。

type
  TForm2 = class(TForm)
    ClientDataSet1: TClientDataSet;
    Grid1: TGrid;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
  public
  end;
[...]

procedure TForm2.FormCreate(Sender: TObject);
var
  AField : TField;
  BindSourceDB1 : TBindSourceDB;
  LinkGridToDataSourceBindSourceDB1 : TLinkGridToDataSource;
  LinkGridToDataSourceBindSourceDB2 : TLinkGridToDataSource;
begin
  AField := TIntegerField.Create(Self);
  AField.FieldName := 'ID';
  AField.FieldKind := fkData;
  AField.DataSet := ClientDataSet1;

  AField := TStringField.Create(Self);
  AField.FieldName := 'Name';
  AField.Size := 20;
  AField.FieldKind := fkData;
  AField.DataSet := ClientDataSet1;

  BindSourceDB1 := TBindSourceDB.Create(Self);
  BindSourceDB1.DataSet := ClientDataSet1;

  LinkGridToDataSourceBindSourceDB1 := TLinkGridToDataSource.Create(Self);
  LinkGridToDataSourceBindSourceDB1.DataSource := BindSourceDB1;
  LinkGridToDataSourceBindSourceDB1.GridControl := Grid1;

  LinkGridToDataSourceBindSourceDB2 := TLinkGridToDataSource.Create(Self);
  LinkGridToDataSourceBindSourceDB2.DataSource := BindSourceDB1;
  LinkGridToDataSourceBindSourceDB2.GridControl := StringGrid1;

  ClientDataSet1.IndexFieldNames := 'ID';
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.InsertRecord([1, 'AName']);
  ClientDataSet1.InsertRecord([2, 'AnotherName']);
  ClientDataSet1.InsertRecord([3, 'ThirdName']);
  ClientDataSet1.InsertRecord([4, 'FourthName']);
  ClientDataSet1.InsertRecord([5, 'FifthName']);
  ClientDataSet1.First;

end;

回答晚了,但也许对某人有帮助。 LinkGrid 必须由

激活
aLinkTableToDataSource.Active:= True;