Странное поведение фильтра в сетке DevExpress

У меня есть форма с двумя сетками, показывающими записи, выбранные с использованием параметра master-detail в 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;

Если я сделаю это, я получу ожидаемый результат, если я сначала не нажму кнопку, которая дает мне основные записи, которые имеют подробные записи, а затем нажму кнопку, которая не дает мне основных записей - в этом случае подробные записи из предыдущего выбора все еще показано в моей подробной сетке

Что я могу сделать, чтобы избавиться от этого?


person OZ8HP    schedule 14.01.2013    source источник
comment
Похоже на ошибку в сетке, вы сообщили об этом в DevExpress?   -  person jachguate    schedule 15.01.2013
comment
Сетка покажет все, что активно в базовом наборе данных... (у этого есть некоторые действительно приятные побочные эффекты при повторном использовании наборов данных между окнами)   -  person Leonardo Herrera    schedule 15.01.2013


Ответы (1)


Такое поведение вызвано тем, что фильтрация выполняется на уровне 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;
person bummi    schedule 15.01.2013