Проверьте в строке TDataSet по строке фильтра - PullRequest
4 голосов
/ 21 мая 2009

Я использую DevExpress TdxMemData в памяти потомка TDataSet. Хотя он имеет свойства Filtered: Boolean и Filter: String, он, по-видимому, фактически ничего с ними не делает, вместо этого полагается на результат параметра Accept события OnFilterRecord.

Итак, я ищу способ (может быть, в TdxMemData или где-то еще в наборе кода DevExpress) проанализировать текст фильтра и применить его к набору данных.

В идеале я хотел бы проверить способ проверки отдельной строки на соответствие фильтру, чтобы убедиться, что она совпадает, не отфильтровывая ее из набора данных (я хочу выделить строки, соответствующие фильтру).

Пример строки фильтра:

((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)

Так что есть вложенные и и или или. Он на самом деле построен DevExpress TcxDBFilterControl.

Я действительно надеюсь, что что-то простое мне не хватает.

Обновление: Я открыл билет с DevExpress , чтобы посмотреть, поддерживают ли они какие-либо решения. Я нашел их стандартный ответ, что они не поддерживают фильтрацию в TdxMemData.

Ответы [ 3 ]

4 голосов
/ 21 мая 2009

Я знаю, что это не тот ответ, который вы ищете, но набор данных TdxMemData не поддерживает строки фильтра. Чтобы использовать фильтры, либо закодируйте свое собственное событие OnFilterRecord, либо установите для ProgrammedFilter значение true и заполните FilterList списком записей, которые фильтруются (во время выполнения).

Одной из возможностей может быть кодирование вашего собственного анализатора для сравнения строки фильтра с текущей записью в событии OnFilterRecord.

2 голосов
/ 21 мая 2009

Возможно, вы захотите посмотреть на замену TdxMemData на TkbmMemTable . Он бесплатный, работает аналогично компоненту DX и поддерживает строки фильтра. Вероятно, для переноса потребуется намного меньше времени, чем для реализации анализатора строк фильтра в OnFilterRecord! Он будет работать с другими компонентами DX без проблем.

1 голос
/ 22 мая 2009

То, что вы ищете, это не фильтрация данных, а отображение их по-разному, если они удовлетворяют условию. Если вы используете TDBGrid для отображения данных, посмотрите на событие DrawColumnCell () в TDBGrid:

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DBG: TDBGrid;
begin
  DBG := TDBGrid(Sender);
  // Add any other conditions from your 'filter' here in the next line.
  if (YourData.FieldByName('WHATEVER').AsString = 'Jim') and
     (YourData.FieldByName('REP').AsInteger > 1000) then
    Column.Font.Color := clRed;
  DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Поскольку вы используете TdxMemData, вы, вероятно, тоже используете сетку DevEx. У него должен быть подобный способ сделать что-то кроме рисунка по умолчанию; Вы можете использовать аналогичную технику там. (Я не использовал вещи DevEx в течение нескольких лет; нынешний работодатель не любит их, и поэтому не будет платить за расходы. :-()

...