问题描述
我想使用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;