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格式
效果:

 

posted @ 2024-07-13 18:13  Tag  阅读(8)  评论(0编辑  收藏  举报