Delphi Firedac大师详解多篇

问题描述 投票:0回答:2

我有 2 个关系主详细信息表,显示在 2

TDBGrid
中。

现在我想在

TEdit
控件中显示表格详细信息行上的每个字段,但现在我只查看第一组
TEdit
中的第一行详细信息。

Delphi IDE - Form Designer | Delphi Programming

delphi firedac tdbgrid
2个回答
2
投票

如果这是一个 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;



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.