4

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

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

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

示例过滤器字符串:

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

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

我真的希望我缺少一些简单的东西。

更新:我向DevExpress 开了一张票,看看他们是否支持任何类型的解决方案。我确实找到了他们不支持在 TdxMemData 上过滤的答案。

4

3 回答 3

4

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

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

于 2009-05-20T23:18:25.470 回答
2

您可能想看看用 TkbmMemTable 替换TdxMemData。它是免费的,工作方式类似于 DX 组件,并支持过滤字符串。与在 OnFilterRecord 中实现过滤器字符串解析器相比,移植所需的时间可能要少得多!它可以与其他 DX 组件一起使用而不会出现问题。

于 2009-05-20T23:35:43.097 回答
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 的东西了;现在的雇主不喜欢它们,因此不会花这笔钱。:-()

于 2009-05-21T21:55:04.137 回答