delphi dbGridEh显示数据集,但不允许从一行移动到另一行,也不显示数据集的更新

delphi dbGridEh显示数据集,但不允许从一行移动到另一行,也不显示数据集的更新,delphi,adodb,dbgrid,Delphi,Adodb,Dbgrid,我有一个TDataModule,包含2个问题和2个数据源:Master和Detail DataModule.DetailQuery.Datasource := MasterQueryDataSource; 我以单独的形式显示这些查询中的数据集。每次都会创建一个新的表单实例。表单有一个MasterDbGridEh和一个DetaildbGridEh绑定到master和details数据源。用户完成编辑后,表单将被销毁,查询将关闭。当用户下次需要打开窗口时,将创建一个新实例并激活查询 当表单第一次被

我有一个TDataModule,包含2个问题和2个数据源:Master和Detail

DataModule.DetailQuery.Datasource := MasterQueryDataSource;
我以单独的形式显示这些查询中的数据集。每次都会创建一个新的表单实例。表单有一个MasterDbGridEh和一个DetaildbGridEh绑定到master和details数据源。用户完成编辑后,表单将被销毁,查询将关闭。当用户下次需要打开窗口时,将创建一个新实例并激活查询

当表单第一次被调用时,一切正常。 但是第二次我发现这个问题的细节是: 它显示选择了第一行的数据集,但当我尝试滚动时,无法在网格中向上或向下移动。将新行追加到数据集后,将不显示新行。 当我尝试向上或向下移动时,dataset AfterScroll事件触发,数据集实际上在后台滚动,但dbgrideh不显示滚动和更改。 在首次显示数据集之后,dbgrid似乎与数据源失去了联系

更新 查询结构: 数据模型由实体组成:订单,每个订单由几个作业组成,每个作业有几个参与者。 因此有3个查询:OrderEditQuery、JobEditQuery和JobParticipantQuery; JobEditQuery依赖于OrderEditQuery,并具有从OrderEditQuery获取的参数ORDER\u ID JobParticipantsQuery依赖于JobEditQuery,并具有从JobEditQuery获取的参数JoB\u ID

打开JobEditorForm时,仅编辑一个订单,但用户应该能够浏览和编辑订单的作业,以及浏览和编辑每个作业的参与者

代码:

在主窗体中调用编辑器窗体的代码:

with TJobEditorForm.Create(Self, orderID,  // constructor
 jobID, officeID) do
 begin
   ShowModal;
 end;
建造商:

constructor TJobEditorForm.Create(AOWner: TComponent; orderID: integer;
  jobID: integer; officeID: integer);
begin
  self.Create(AOwner);
  _orderID := orderID;
  _startingJobID := jobID;
  _officeID := officeID;
end;
节目形式:

procedure TJobEditorForm.FormShow(Sender: TObject);
begin
   jobEditDataModule.ActivateQueries(_orderID, _officeID); 
   // jobEditdatamodule is the datamodule where the queries sit
end;

procedure TJobEditDataModule.ActivateQueries(orderID, officeID : integer);
begin

  CloseQueries; // put this in to ensure that all queries are closed before they are reopened
  // different auxiliary queries used for look up fields
  Data.VID_ALL.Active := false;
  Data.VID_ALL.Parameters.ParamValues['office'] := officeID;
  Data.VID_ALL.Active := true;

  Data.KOEF_ALL.Active := false;
  Data.KOEF_ALL.Parameters.ParamValues['podr'] := officeID;
  Data.KOEF_ALL.Active := true;

  Data.Jobstatuses_All.Active := true;
  Data.Attract_Channels_All.Active := true;

  JobEditDataModule.Customers.Active := true;
  EmployeeDataModule.Employees.Active := true;

  // this is the query that gives me trouble 
  JobParticipantsQuery.Active := false;

  // main query
  OrderEditQuery.Parameters.ParamValues['orderID'] := orderID;
  OrderEditQuery.Open;
  OrderEditQuery.EnableControls;

  // first details query. Dependent on OrderEditQuery (takes two params: officeID and OrderID.         OrderID is taken from OrderEditQuery, on which JobEditQuery depends)
  JobEditQuery.Active := false;
  JobEditQuery.EnableControls;
  JobEditDataModule.JobEditQuery.Parameters.ParamValues['officeID'] := officeID;
  TDataUtils.EnsureActive( [ JobEditQuery ]);
  JobEditQuery.EnableControls;

  // JobPArticipantsQuery is details query dependent on JobEditQuery.
  JobparticipantsQuery.DisableControls;
  JobparticipantsQuery.EnableControls;
  JobParticipantsQuery.Active := true;
  JobparticipantsQuery.EnableControls;
end;
关闭编辑器窗体时,将执行CloseQueries过程:

procedure TJobEditDataModule.CloseQueries;
 begin
   OrderEditQuery.DisableControls;
   JobParticipantsQuery.DisableControls;
   JobparticipantsQuery.DisableControls;

 JobParticipantsQuery.Close;
 JobEditQuery.Close;
 OrderEditQuery.Close;
end;

问题是我们看不到您的代码或屏幕!:=请您在q中添加创建表单所用的代码,好吗?行为上的差异很可能与表单的编码方式有关。试试这个:如果您的表单单元定义了TmyForm,并且在该单元的接口部分的表单声明下面有一个变量myForm:TmyForm,请注释掉该变量,看看该单元是否仍将编译。如果不行,请将编译器抱怨未声明标识符的代码添加到q中。我从单元中删除了myForm:TMyForm声明,只使用我自己创建的TMyForm实例。我将从删除所有禁用/启用控件调用开始,因为这似乎是第二次打开表单时的罪魁祸首,根据您的描述。由于所有操作都是在创建/显示/关闭期间完成的,因此控件不会产生任何反应,也不会产生巨大的性能影响。顺便说一句,我同意关于删除所有Disabe/EnableControls的评论。你应该两人一组,在相同的程序中使用它们,不要在一个地方使用一个,在另一个地方使用另一个,因为如果它们不完全平衡,你很可能会得到你描述的问题。原因是EnableControls在计数器变量降为零之前实际上不会执行任何操作,因此,如果禁用比启用多一个,则控件将保持冻结状态。顺便说一句,在关闭数据集之前禁用它的控件是毫无意义的,应该是完全没有必要的。