1

我有一个带有 2 个网格的表单,显示使用 Devart UniQuery 上的主从选项选择的记录。这很好地显示了与主相关的详细记录。我可以选择使用过滤器选择记录(公司)。这是由 30 个按钮完成的,每个按钮上都有一个字母,然后当按下一个时,我使用此代码设置过滤器

procedure TfrmJsCompanies.ButtonClick(Sender: TObject);
var
  ButtonValue: char;
  FilterString: string;
begin
  ButtonValue := (Sender as TcxButton).Caption[1];
  FilterString := ButtonValue + '%';
  with grdCompaniesView1.DataController.Filter.Root do
    begin
      Clear;
      BoolOperatorKind := fboOr;
      AddItem(colCompany_Name, foLike, FilterString, FilterString);
    end;
  grdCompaniesView1.DataController.Filter.Active := True;
  grdCompaniesView1.FilterRow.Visible := False;
  ActiveControl := grdCompanies;
end;

如果我这样做,我会得到我期望的结果,除非我首先按下一个按钮,该按钮给我有详细记录的主记录,然后按下一个没有给我主记录的按钮 - 在这种情况下,之前选择的详细记录仍然是显示在我的详细信息网格中

我能做些什么来摆脱这个?

4

1 回答 1

3

此行为是由于过滤是在 cxGrid 级别执行的,而不是在 DataSet 级别执行的,因此不会过滤 DataSet。
一种处理方法可能是:

procedure TForm1.DetailViewFilterRecord(ADataController: TcxCustomDataController; ARecordIndex: Integer;
  var Accept: Boolean);
begin
  Accept := MasterView.DataController.FilteredRecordCount >0;
end;

procedure TForm1.MasterViewDataControllerFilterChanged(Sender: TObject);
begin
   DetailView.DataController.Refresh
end;
于 2013-01-15T05:57:21.537 回答