我有一个表单,有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;
如果我这样做,我会得到我期望的结果,除非我先按下一个按钮,给我有详细记录的主记录,然后按下一个按钮,给我没有主记录-在这种情况下,从以前的选择的详细记录仍然显示在我的详细网格
我怎么做才能摆脱这个?
这种行为是由于过滤是在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;