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