cxGrid过滤器可以缺省%

参考:http://bbs.csdn.net/topics/390536919,该帖子的目的:like的匹配情况有: %国%   国%   %国,但是只需要实现匹配情况只有: %国%,填入国即匹配%国%,如果按照帖子的设置会影响我自定义修改好的FilterRow功能的自动匹配功能,而且不支持_匹配全部会变成%匹配

而我这篇文章的效果在不改变_效果的前提下,对于%匹配应该是 %国%   国%   %国效果不变,而国缺省就是%国%(只查询国请使用等于条件不要使用like条件),并且不能影响已经修改好的FilterRow功能的自动匹配,  国缺省就是%国%,但是FilterRow最终不能实现%国和国%,默认会匹配出国%,右%是DEVExpress强制加的,找了很久都找不到修改的地方,唯一遗憾,2013-10-13找到官方英文帖子,官方回复计划在14.1版本中有望解决默认强制增加右%的问题。


先复制论坛帖子的解决方法作为引导:

-------------------------------------------默认只改变自定义过滤框(图1),不改变过滤器(过滤框)(图2)-------------------------------------------------



1 把这个文件复制到你的程序目录
\DevExpress VCL\ExpressDataController\Sources\cxFilter.pas

2 TcxFilterCriteria.AddItem过程做如下修改:(自动给like, not like运算的查询条件加%)


function TcxFilterCriteria.AddItem(AParent: TcxFilterCriteriaItemList; AItemLink: TObject;
  AOperatorKind: TcxFilterOperatorKind; const AValue: Variant;
  const ADisplayValue: string): TcxFilterCriteriaItem;
begin
  if AParent = nil then
    AParent := Root;

  if AOperatorKind in [foLike, foNotLike] then
    Result := AParent.AddItem(AItemLink, AOperatorKind, '%' + AValue + '%', ADisplayValue)
  else
    Result := AParent.AddItem(AItemLink, AOperatorKind, AValue, ADisplayValue);
end;</span>


-------------------------------------------默认只改变自定义过滤框(图1),也改变过滤器(过滤框)(图2)---------------------------------------------

之前的修改全部取消.

一下改动完成后, 所有使用该文件做过滤的, like, not like 都会受影响
-------------------------------------------------------
把这个文件复制到你的程序目录
\DevExpress VCL\ExpressDataController\Sources\cxLike.pas

function LikeStr(const AStr, APatternStr: string; APercent, AUnderline: Char): Boolean;
var
  vPatternStr : string;
begin
  vPatternStr := Format('%%%s%%', [APatternStr]);
  Result := Like(PChar(AStr), Length(AStr), PChar(vPatternStr),
    Length(vPatternStr), APercent, AUnderline, #0);
end;

2、我的改动:

找到\DevExpress VCL\ExpressDataController\Sources\cxLike.pas,修改如下:

function LikeStr(const AStr, APatternStr: string; APercent, AUnderline: Char): Boolean;
//-----------------------------修改成自动匹配like为左右%,但是_除外的效果-----------------------------
var
  vPatternStr: string;
begin
  vPatternStr := APatternStr;
  if (Pos('%', APatternStr) = 0) and (Pos('_', APatternStr) = 0)then //为了适应filterRow功能不受影响,否则FilterRow会出现左右各多一个%
    vPatternStr := Format('%%%s%%', [APatternStr]);
  Result := Like(PChar(AStr), Length(AStr), PChar(vPatternStr),
    Length(vPatternStr), APercent, AUnderline, #0);
//-----------------------------修改成自动匹配like为左右%,但是_除外的效果-----------------------------
//-----------------------------原语句-----------------------------
//  Result := Like(PChar(AStr), Length(AStr), PChar(APatternStr),
//    Length(APatternStr), APercent, AUnderline, #0);
//-----------------------------原语句-----------------------------
end;


附:cxgrid的filterrow自动完全匹配(只对字符串类型生效,不影响datetime和checkbox等类型):补充左%,默认只有右%


unit UnitDevExpressVCLCustom;

interface

uses
  cxGrid, cxGridTableView, cxGridDBBandedTableView, Winapi.Windows, System.SysUtils, System.Variants, cxClasses,
  System.Classes, Vcl.Graphics, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, cxCustomData, cxTextEdit, cxEdit,
  cxCheckBox;

type
  TMyCxGrid = class(TCxGrid)
  private
    { Private declarations }
    //变量
    cxGridDBBandedTableView: TcxGridDBBandedTableView;
    ViewData: TcxGridViewData;
    //储存过程和函数

    procedure CustomFilterRow(Sender: TObject);

  public
    { Public declarations }
  end;

procedure IniMyCxGrid(cxGridDBBandedTableView: TcxGridDBBandedTableView);

implementation

procedure TMyCxGrid.CustomFilterRow(Sender: TObject);
var
  I: Integer;
  S: string;
begin
  with cxGridDBBandedTableView, ViewData do
    begin
      if FilterRow.Focused then
        begin
          for I := 0 to ColumnCount - 1 do
            begin
              S := VarToStr(FilterRow.Values[I]); //获取过滤行各列的值
              if (Length(S) > 0) and (S[1] <> '%') and (Pos('_', S) = 0) and (Columns[I].Properties is TcxTextEditProperties) then
                FilterRow.Values[I] := Format('%%%S', [S]);
            end;
        end;
    end;
end;

procedure IniMyCxGrid(cxGridDBBandedTableView: TcxGridDBBandedTableView);
var
  MyCxGrid: TMyCxGrid;
begin
  MyCxGrid := TMyCxGrid.Create(nil);
  MyCxGrid.cxGridDBBandedTableView := cxGridDBBandedTableView;
  cxGridDBBandedTableView.OnCustomDrawIndicatorCell := MyCxGrid.DrawIndicatorCell;
  cxGridDBBandedTableView.DataController.Filter.OnChanged := MyCxGrid.CustomFilterRow;
  MyCxGrid.SetCxGridLayout;
end;

end.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值