繁体   English   中英

检查过滤字符串的TDataSet行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM