簡體   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