效果图:
设计图(数据库是ACCESS类型):
需求:
1.cxGrid默认的模糊匹配符为%,太麻烦了,想用*号代替 (ACCESS数据库,只认*,不认%)
2.cxGrid默认是在用户输入的字符后面加%,但是我需要在前面也要加上,即 %用户输入% ,按要求1的写法就是 *用户输入*.也就是进行包含过虑
实现:
1.设置属性:DataController --Filter.PercentWildCard:= *
2.设置搜索框于表头之下
ApplyChanges是执行过滤的时机.如果你选择了fracDelayed,则可进一步对ApplyInputDelay进行时间设置,默认为1000ms.
info Text可以修改无搜索时的方案
如果你需要美化搜索框,请自行设计style下的FilterRowInfoText.
3.cxGrid的强大是不可否认的,但是它的过滤器难用也是不得不承认的.我也是搜索了半天资料,然后放弃了,最后还得是TFDQuery的过滤器..
这里得调用cxGrid的 DataController --Filter--OnBeforChange事件,以下是全部代码:
procedure TForm1.cxGrid1DBTableView1DataControllerFilterBeforeChange(Sender: TcxDBDataFilterCriteria; ADataSet: TDataSet; const AFilterText: string); var ROld, RNew, OldStr, NewStr: string; begin ROld := ' LIKE '''; RNew := '] LIKE ''' + '*'; //数据为ACCESS.已设置属性DataController.filter.percentwildcard:=* //处理过滤条件,替换字符串 NewStr := StringReplace(AFilterText, RNew, ROld, [rfReplaceAll, rfIgnoreCase]); //先替换 ] LIKE '* 为 LIKE ' NewStr := StringReplace(NewStr, ROld, RNew, [rfReplaceAll, rfIgnoreCase]); //再统一把 LIKE '替换为 ] LIKE '* NewStr := StringReplace(NewStr, '*', '%', [rfReplaceAll, rfIgnoreCase]); NewStr := StringReplace(NewStr, '(', '([', [rfReplaceAll, rfIgnoreCase]); FDQuery1.Filtered := False; FDQuery1.Filter := NewStr; FDQuery1.Filtered := True; self.Caption := AFilterText+' | '+ NewStr; end;
上面的几个StringReplace方法是为了把cxGrid过滤器上的内容,转化为TFDQuery过滤器可用的内容.这里顺便说一下TFDQuery过滤器的规格:
1.字段要用 [ ] 括起来
2.不带 where 关键字
3.FDQuery1.Filtered := True; 时会立即过虑内容,如果有设置OnFilterRecord事件的话,OnFilterRecord也随后被执行.
4.修改过虑条件前,记得先关闭过滤器
标签:LIKE,delphi,cxGrid,TFDQuery,StringReplace,过滤器,NewStr From: https://www.cnblogs.com/yoooos/p/17128231.html