检查在TDataSet的行对过滤字符串
-
23-08-2019 - |
题
我使用的的DevExpress TdxMemData在存储器TDataSet的后裔即可。虽然它已经过滤:布尔和Filter:String类型的属性,它似乎并没有真正与他们自动做任何事,而不是依靠OnFilterRecord事件的接受参数的结果。
所以,我正在寻找一种方法(也许它是在TdxMemData或其他地方中的DevExpress的成套码)来解析过滤文本,并将其应用到数据集。
理想我想方式测试靠在过滤器的单独的行,看它是否不进行过滤出来的数据集的匹配(我要强调过滤条件相符的行)。
实施例过滤字符串:
((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)
因此,有嵌套和的和或的。它实际上是由DevExpress的TcxDBFilterControl建造。
我真的很希望有一些简单的我失踪。
解决方案
我知道这是不是你要找的答案,但TdxMemData数据集不支持过滤字符串。要使用过滤器或者代码自己OnFilterRecord事件或设置ProgrammedFilter为true,并与被过滤的(在运行时)的记录。
列表填充FilterList一种可能是编写自己的解析器来对在OnFilterRecord事件中的当前记录过滤字符串比较。
其他提示
您可能想看看在更换TdxMemData与 TkbmMemTable 。它是免费的,工作方式类似于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格了。它有一个类似的方式做不是默认的图纸以外的东西;你可以使用类似的技术出现。 (I没有用过DevEx东西在几年;当前雇主不喜欢他们,因此不会泉水为代价:-()