默认是不支持过滤的,这里需要改到内部的一些源码文件。
先说思路:
1.要让列支持过滤需要重载richedit类的 GetSupportedOperations,
typeTcxRichEditProperties = class(cxRichEdit.TcxRichEditProperties)publicfunction GetSupportedOperations: TcxEditSupportedOperations; override;end; { TcxRichEditProperties }function TcxRichEditProperties.GetSupportedOperations: TcxEditSupportedOperations; beginResult := [esoAutoHeight, esoEditing, esoHorzAlignment, esoFiltering]; //多加上 esoFiltering end;
然后指定列为: Column.PropertiesClass := TcxRichEditProperties; 不指定,直接设置的话是没有效果的。
要在过滤的时候能输入,需要处理一下GetProperties。放一个 cxEditRepository ,添加一个 RichItem 一个TextEditItem
procedure TForm1.ColumnGetProperties(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;var AProperties: TcxCustomEditProperties); beginif ARecord is TcxGridFilterRow thenbeginAProperties := cxdtrpstrytxtmcxdtrpstry1TextItem1.Properties;endelsebeginAProperties := cxdtrpstry1RichItem1.Properties;end; end;
还要处理,下拉过滤选择显示的问题,不处理。选择某一个过滤条件后。显示的是RTF格式的内容
procedure TForm1.ColumnGetDisplayText(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;var AText: String); beginif AText = '' thenExit;if ARecord is TcxGridFilterRow thenif IsRichText(AText) thenAText := ConvertRichText(AText); end;
接下来是核心过滤的改动,cxfilter.pas文件 Compare 函数 .这里只贴
Result := AItem.Operator.CompareValues(V, V2);
之前要处理的代码。需要uses cxRichEdit, cxGridCustomTableView 这两个单元。判断过滤列是不是 TcxRichEditProperties 然后把RTF 转成纯文本就可以过滤了
function IsRichText(const AText: string): Boolean;constARichPrefix = '{\rtf';beginResult := Copy(AText, 1, Length(ARichPrefix)) = ARichPrefix;end;function Compare(AItem: TcxFilterCriteriaItem): Boolean;varV,V2: Variant;begintryif AItem.ItemLink <> nil thenbeginif AItem.ItemLink is TcxCustomGridTableItem thenbeginif TcxCustomGridTableItem(AItem.ItemLink).PropertiesClassName = 'TcxRichEditProperties' thenif not IsRichText(v2) then //一般不可能输入rtf 格式的内容。 这里会触发的就是选过滤下拉选项那些V := ConvertRichText(V); //转换后只剩下纯文本end;end;Result := AItem.Operator.CompareValues(V, V2);end;end;
效果: