而我这篇文章的效果在不改变_效果的前提下,对于%匹配应该是 %国% 国% %国效果不变,而国缺省就是%国%(只查询国请使用等于条件不要使用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.