代码之家  ›  专栏  ›  技术社区  ›  Jim McKeeth

根据筛选字符串在TDataset行进行检查

  •  4
  • Jim McKeeth  · 技术社区  · 15 年前

    我正在使用 devexpress tdxmemdata软件 内存中的数据集子代。虽然它已经过滤了:boolean和filter:string属性,但它似乎不会自动对它们执行任何操作,而是依赖于onfilterrecord事件的accept参数的结果。

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

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

    筛选器字符串示例:

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

    所以有嵌套的、和或。它实际上是由devexpress tcxdbfiltercontrol构建的。

    我真的希望有一些简单的东西我错过了。

    更新: 我打开了一个 ticket with DevExpress 看看他们是否支持任何解决方案。我确实找到了他们的股票答案 they don't support filtering 关于TDXMEMDEATA。

    3 回复  |  直到 15 年前
        1
  •  4
  •   skamradt    15 年前

    我知道这不是您想要的答案,但是TDXMEMDATA数据集不支持筛选字符串。要使用筛选器,请对自己的OnFilterRecord事件进行编码,或者将ProgrammedFilter设置为true,并用筛选的记录列表(在运行时)填充FilterList。

    一种可能是编写自己的解析器代码,将筛选字符串与onfilterrecord事件中的当前记录进行比较。

        2
  •  2
  •   Tim Sullivan    15 年前

    您可能希望将TDxEMdata替换为 TkbmMemTable . 它是免费的,工作原理类似于dx组件,并且支持过滤字符串。与在onfilterrecord中实现筛选字符串分析器相比,移植所需的时间可能要少得多!它将与其他DX组件一起工作,不会出现问题。

        3
  •  1
  •   Ken White    15 年前

    您要寻找的不是过滤数据,而是在满足某个条件时以不同的方式显示数据。如果使用tdbgrid显示数据,请查看tdbgrid上的drawColumnsCell()事件:

    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的东西了,现在的老板不喜欢,所以也不会为这些花费而发财。-()

    推荐文章