[英]Check at TDataSet row against a filter string
我在内存TDataSet后代使用DevExpress TdxMemData 。 虽然它具有Filtered:Boolean和Filter:String属性,但它似乎并不会自动对它们执行任何操作,而是依赖于OnFilterRecord事件的Accept参数的结果。
所以我正在寻找的方法(可能是在TdxMemData或DevExpress的代码套件中的其他地方)来解析过滤器文本并将其应用于数据集。
理想情况下,我想要一种方法来测试针对过滤器的单个行,以查看它是否匹配而不将其从数据集中过滤掉(我想要突出显示与过滤器匹配的行)。
示例过滤字符串:
((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)
所以有嵌套和's和或。 它实际上是由DevExpress TcxDBFilterControl构建的。
我真的希望有一些简单的我想念。
更新:我用DevExpress打开了一张票,看他们是否支持任何解决方案。 我确实发现他们的股票回答他们不支持在TdxMemData上过滤。
我知道这不是你要找的答案,但TdxMemData数据集不支持过滤字符串。 要使用过滤器,请编写自己的OnFilterRecord事件代码或将ProgrammedFilter设置为true,并使用已过滤的记录列表(在运行时)填充FilterList。
一种可能性是编写您自己的解析器,以将过滤器字符串与OnFilterRecord事件中的当前记录进行比较。
您可能希望查看使用TkbmMemTable替换TdxMemData 。 它是免费的,与DX组件类似,并支持过滤字符串。 移植可能比在OnFilterRecord中实现过滤器字符串解析器要花费更少的时间! 它可以毫无问题地与其他DX组件一起使用。
您正在寻找的不是过滤数据,而是在满足条件时以不同方式显示数据。 如果您使用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的东西;现在的雇主不喜欢它们,因此不会花费费用。:-()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.