检查过滤字符串的TDataSet行

时间:2009-05-20 22:17:53

标签: delphi filter devexpress tdataset tdxmemdata

我在内存TDataSet后代使用 DevExpress TdxMemData 。虽然它具有Filtered:Boolean和Filter:String属性,但它似乎并不会自动对它们执行任何操作,而是依赖于OnFilterRecord事件的Accept参数的结果。

所以我正在寻找的方法(可能是在TdxMemData或DevExpress的代码套件中的其他地方)来解析过滤器文本并将其应用于数据集。

理想情况下,我想要一种方法来测试针对过滤器的单个行,看它是否匹配而不将其从数据集中过滤掉(我想突出显示与过滤器匹配的行)。

示例过滤字符串:

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

所以有嵌套和's和或。它实际上是由DevExpress TcxDBFilterControl构建的。

我真的希望有一些我想念的简单。

更新:我打开了ticket with DevExpress,看看他们是否支持任何解决方案。我确实在TdxMemData上找到了they don't support filtering的股票回答。

3 个答案:

答案 0 :(得分:4)

我知道这不是您要找的答案,但TdxMemData数据集不支持过滤字符串。要使用过滤器,请编写自己的OnFilterRecord事件或将ProgrammedFilter设置为true,并使用过滤的记录列表填充FilterList(在运行时)。

一种可能性是编写自己的解析器,将过滤器字符串与OnFilterRecord事件中的当前记录进行比较。

答案 1 :(得分:2)

您可能希望将{TdxMemData替换为TkbmMemTable。它是免费的,与DX组件类似,并支持过滤字符串。移植可能比在OnFilterRecord中实现过滤器字符串解析器要花费更少的时间!它可以毫无问题地与其他DX组件一起使用。

答案 2 :(得分:1)

您正在寻找的不是过滤数据,而是在满足条件时以不同方式显示数据。如果您使用TDBGrid显示数据,请查看TDBGrid上的DrawColumnCell()事件:

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的东西;现在的雇主不喜欢它们,因此不会花费费用。:-()