delphi dev cxgrid 列绑定Richedti 支持过滤
默认是不支持过滤的,这里需要改到内部的一些源码文件。
先说思路:先把richedit.pas 中的 ConvertRichText IsRichText 开放出来。多加上声明
1.要让列支持过滤需要重载richedit类的 GetSupportedOperations,
type TcxRichEditProperties = class(cxRichEdit.TcxRichEditProperties) public function GetSupportedOperations: TcxEditSupportedOperations; override; end; { TcxRichEditProperties } function TcxRichEditProperties.GetSupportedOperations: TcxEditSupportedOperations; begin Result := [esoAutoHeight, esoEditing, esoHorzAlignment, esoFiltering]; //多加上 esoFiltering end;
然后指定列为: Column.PropertiesClass := TcxRichEditProperties; 不指定,直接设置的话是没有效果的。
要在过滤的时候能输入,需要处理一下GetProperties。放一个 cxEditRepository ,添加一个 RichItem 一个TextEditItem
procedure TForm1.ColumnGetProperties( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties); begin if ARecord is TcxGridFilterRow then begin AProperties := cxdtrpstrytxtmcxdtrpstry1TextItem1.Properties; end else begin AProperties := cxdtrpstry1RichItem1.Properties; end; end;
还要处理,下拉过滤选择显示的问题,不处理。选择某一个过滤条件后。显示的是RTF格式的内容
procedure TForm1.ColumnGetDisplayText( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: String); begin if AText = '' then Exit; if ARecord is TcxGridFilterRow then if IsRichText(AText) then AText := ConvertRichText(AText); end;
接下来是核心过滤的改动,cxfilter.pas文件 Compare 函数 .这里只贴
Result := AItem.Operator.CompareValues(V, V2);
之前要处理的代码。需要uses cxRichEdit, cxGridCustomTableView 这两个单元。判断过滤列是不是 TcxRichEditProperties 然后把RTF 转成纯文本就可以过滤了
function Compare(AItem: TcxFilterCriteriaItem): Boolean; var V,V2: Variant; begin try V := PrepareValue(AItem.GetDataValue(AData)); // for Null special compare if (fcoIgnoreNull in Options) and not AItem.Operator.IsNullOperator and AItem.ValueIsNull(V) then Result := False else begin V2 := AItem.PreparedValue; if AItem.ItemLink <> nil then begin if AItem.ItemLink is TcxCustomGridTableItem then begin if TcxCustomGridTableItem(AItem.ItemLink).PropertiesClassName = 'TcxRichEditProperties' then begin //V2 是输入或者选中过滤的值 V 是列的值 NULL的情况也不用转 if not VarIsNull(v2) then if not IsRichText(v2) then //一般不可能输入rtf 格式的内容。如果v2是输入rtf的那么V也不用转换。 if not VarIsNull(V) then V := ConvertRichText(V); //转换后只剩下纯文本 end; end; end; Result := AItem.Operator.CompareValues(V, V2); end; except on EVariantError do if fcoSoftCompare in Options then Result := False else raise; end; end;
还有一些地方没有处理:
点开下面的自定义过滤界面还是会显示RTF格式
效果: