Delphi Firedac master详细介绍了多个

时间:2017-02-02 11:41:07

标签: delphi firedac

我在2个tdbgrid中显示关于master-details的2个表。现在  我想在Tedit控件中显示表详细信息行的每个字段,但现在我只查看第一组tedit中的第一行详细信息。

enter image description here

2 个答案:

答案 0 :(得分:2)

如果这是一个VCL项目(​​而不是FireMonkey项目),你可以非常简单地做到这一点。

  • 在表单上放置一个TDBCtrlGrid,并为详细数据集设置DataSource

  • 在IDE中,DBCtrlGrid将显示一系列垂直面板,一个是实心灰色,另一个是条纹。在纯灰色面板上放置像TDBEdits这样的db-aware控件,设置它们的DataField属性,然后编译并运行。 DBCtrlGrid具有Orientation属性,您可以根据自己的喜好将其设置为垂直或水平。

您应该看到,在运行时,DBCtrlGrid会填充面板的实例和它包含的db-aware组件,因为它们有详细记录,最多可达DBCtrlGrid的RowCount属性指定的数字。如果要确保有足够的面板副本,可以尝试将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;

答案 1 :(得分:0)

只需在表单上放置一个TDBEdit,然后设置其Datafield属性和详细信息表的Datasource属性。