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