Проверьте строку TDataSet на соответствие строке фильтра.

StackOverflow https://stackoverflow.com/questions/890541

Вопрос

я использую Девэкспресс Тдксмемдата в памяти потомок TDataSet.Пока он отфильтрован:Логическое значение и фильтр:Строковые свойства, похоже, что он ничего не делает с ними автоматически, вместо этого полагаясь на результат параметра Accept события OnFilterRecord.

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

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

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

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

Итак, есть вложенные операторы and и or.На самом деле он создан DevExpress TcxDBFilterControl.

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Вам нужна не фильтрация данных, а их отображение по-другому, если они соответствуют условию.Если вы используете 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 уже несколько лет;нынешнему работодателю они не нравятся, и поэтому он не будет тратить деньги.:-( )

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top