如果这是一个 VCL 项目(而不是 FireMonkey 项目),您可以非常简单地做到这一点。
您应该看到,在运行时,DBCtrlGrid 填充了与详细记录一样多的面板实例和它包含的 db 感知组件,最多由 DBCtrlGrid 的 RowCount 属性指定的数量。如果要确保有足够的面板副本,可以尝试将RowCount 值设置为主数据集的RecordCount' of the detail dataset in theAfterScroll` 事件。
另一方面,如果它是一个 FireMonkey (FMX) 项目,因此您需要使用 LiveBindings(没有 TDBCtrlGrids),它可能可以按照与您类似的方式执行此操作会设置控件来显示主数据集的字段,但我从未尝试过。
以下最小的 VCL 项目代码摘录显示了 DBCtrlGrid 的使用;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBClient,
dbcgrids, Mask;
type
TForm1 = class(TForm)
cdsMaster: TClientDataSet;
cdsDetail: TClientDataSet;
dsMaster: TDataSource;
dsDetail: TDataSource;
gMaster: TDBGrid;
dbnavMaster: TDBNavigator;
gDetail: TDBGrid;
dbnavDetail: TDBNavigator;
DBCtrlGrid1: TDBCtrlGrid;
DBEdit1: TDBEdit; // placed in DBCtrlGrid1
DBEdit2: TDBEdit; // placed in DBCtrlGrid1
procedure cdsMasterAfterScroll(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
private
public
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
i,
j : Integer;
Field : TIntegerField;
begin
DBEdit1.DataField := 'MasterID';
DBEdit2.DataField := 'DetailID';
Field := TIntegerField.Create(Self);
Field.FieldName := 'MasterID';
Field.DataSet := cdsMaster;
cdsMaster.CreateDataSet;
Field := TIntegerField.Create(Self);
Field.FieldName := 'DetailID';
Field.DataSet := cdsDetail;
Field := TIntegerField.Create(Self);
Field.FieldName := 'MasterID';
Field.DataSet := cdsDetail;
cdsDetail.MasterSource := dsMaster;
cdsDetail.MasterFields := 'MasterID';
cdsDetail.IndexFieldNames := 'MasterID;DetailID';
cdsDetail.CreateDataSet;
for i := 1 to 10 do begin
cdsMaster.InsertRecord([i]);
for j := 1 to i do
cdsDetail.InsertRecord([j, i]);
end;
cdsMaster.First;
end;
procedure TForm1.cdsMasterAfterScroll(DataSet: TDataSet);
begin
cdsDetail.DisableControls;
try
DBCtrlGrid1.RowCount := cdsDetail.RecordCount;
finally
cdsDetail.EnableControls;
end;
end;