我有 2 个关系主详细信息表,显示在 2
TDBGrid
中。
现在我想在
TEdit
控件中显示表格详细信息行上的每个字段,但现在我只查看第一组 TEdit
中的第一行详细信息。
如果这是一个 VCL 项目(而不是 FireMonkey 项目),您可以非常简单地完成此操作。
在表单上放置一个 TDBCtrlGrid 并将其
DataSource
设置为详细数据集。在 IDE 中,DBCtrlGrid 将显示一系列垂直面板,其中一个为纯灰色,其他为条纹。 将 TDBEdits 等数据库感知控件放置在纯灰色面板上,设置其 DataField 属性,然后编译并运行。 DBCtrlGrid 有一个
Orientation
属性,您可以根据您的喜好将其设置为垂直或水平。您应该看到,在运行时,DBCtrlGrid 填充了与详细记录一样多的面板实例及其包含的数据库感知组件,最多达到 DBCtrlGrid 的
RowCount
属性指定的数量。 如果您想确保面板有足够的副本,您可以尝试将 RowCount
值设置为主数据集的 RecordCount' of the detail dataset in the
AfterScroll` 事件。
另一方面,如果它是 FireMonkey (FMX) 项目,因此您需要使用 LiveBindings(没有 TDBCtrlGrid),则可以通过与设置控件以显示主数据集的字段,但我从未尝试过。 以下最小 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;