通过代码将数据库 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;
我想使用 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;