Если это проект VCL (а не FireMonkey), вы можете сделать это очень просто.
-
Поместите TDBCtrlGrid в свою форму и установите его
DataSource
для набора данных детали. -
В IDE DBCtrlGrid отобразит вертикальную серию панелей, один цветной сплошной серый, а другие - полосатые. Поместите элементы управления db, такие как TDBEdits на сплошной серой панели, установите их свойства DataField, затем выполните компиляцию и запуск. DBCtrlGrid имеет
Orientation
свойство, которое вы можете установить на вертикальное или горизонтальное, в соответствии с вашими предпочтениями.
Вы должны увидеть, что во время выполнения DBCtrlGrid заполняет столько экземпляров панели и компонентов, поддерживающих db, что и содержит подробные записи, вплоть до номера, указанного RowCount
свойством DBCtrlGrid . Если вы хотите убедиться, что имеется достаточное количество копий панели, вы можете попробовать установить RowCount
значение в RecordCount' of the detail dataset in the
событие AfterScroll` основного набора данных.
С другой стороны, если это проект 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;