通过代码

问题描述

我想使用LiveBindings将数据库表连接到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显示表头,但行保持为空。这意味着表和字符串网格之间存在连接,列具有正确的标题,但未显示内容。那我哪里出问题了?

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

非常感谢您的回答!

解决方法

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

一些实验应该使您满意,实际上在代码中设置了Live Bindings 非常简单,但是对步骤的顺序很敏感。与使用VCL和传统的db-ware控件相比,Live Binding似乎需要以正确的方式连接正确的事物,以使其正常工作。请注意,与您的代码不同,我的代码不会涉及BindSorce的Datasource属性,因为它不是必需的。

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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...