关于 cxGrid 的过滤问题

zhengyc653 2013-08-03 03:14:15
今天用了一下cxGrid的过滤功能,非常强大,非常喜欢!
可是有一个缺点,他的运算符里面只有 like ,没有包含。
比如:我要找一个姓名包含‘国’字的人。
运算符必须得选 like 表达式则是:%国%
这样很多人就不懂得用了。

如何使它无需加%%就能过滤出名字包含'国'的人?

...全文
1313 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonhehe 2013-08-07
  • 打赏
  • 举报
回复
之前的修改全部取消. 一下改动完成后, 所有使用该文件做过滤的, 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;
zhengyc653 2013-08-07
  • 打赏
  • 举报
回复
非常感谢 simonhehe 的热心助助!!问题解决,分不多,全给你了。
zhengyc653 2013-08-06
  • 打赏
  • 举报
回复
filterControl.ApplyFilter; filterControl 这个对象在哪? 在这个单元好像没找到这个对象 不知道是引引哪个单元的东东
zhengyc653 2013-08-06
  • 打赏
  • 举报
回复
引用 11 楼 simonhehe 的回复:
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;

非常感谢这位仁兄的帮助,问题解决了一半,按照你的方法,确实可行,但只适用于这个界面:

对于下面这个界面没有效果:

zhengyc653 2013-08-06
  • 打赏
  • 举报
回复
思路: 应该在过滤窗体中找到确定这个按钮,然后更改生成出来的过滤字串。 于是,找到 cxFilterControlDialog.pas ,查看 OK 按钮的 OnClick 事件 发现里面只有一条语句: ApplyFilter; 于是,再跟踪 ApplyFilter 函数,它的声明如下: procedure ApplyFilter; virtual;

procedure TfmFilterControlDialog.ApplyFilter;
begin
  SetControlsEnabled(False);
  DoBeforeApply;
  try
    FilterControl.ApplyFilter;
  finally
    DoAfterApply;
    SetControlsEnabled(True);
  end;
end;
继续跟踪 DoBeforeApply ,发现其也是一个虚方法:

procedure TfmFilterControlDialog.DoBeforeApply;
begin
  if Assigned(FOnBeforeApply) then
    FOnBeforeApply(Self);
end;
又发现 FOnBeforeApply 的声明为: FOnBeforeApply: TNotifyEvent; 到这,就不懂得如何往下跟踪了...
zhengyc653 2013-08-06
  • 打赏
  • 举报
回复
引用 7 楼 simonhehe 的回复:
lz的需求, 只能改dev的代码实现 like的匹配情况有: %国% 国% %国 你需求的[包含], 匹配情况只有: %国%
我也不知道要改Dev的代码,可跟踪来跟踪去,就是不知道要在哪改!
simonhehe 2013-08-06
  • 打赏
  • 举报
回复
lz的需求, 只能改dev的代码实现 like的匹配情况有: %国% 国% %国 你需求的[包含], 匹配情况只有: %国%
zhengyc653 2013-08-06
  • 打赏
  • 举报
回复
自己顶一下.... 难道没人遇到这个问题?
simonhehe 2013-08-06
  • 打赏
  • 举报
回复
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;
22222bbb 2013-08-03
  • 打赏
  • 举报
回复
二楼没明白楼主的意思。同求解决方法
zhengyc653 2013-08-03
  • 打赏
  • 举报
回复
引用 3 楼 ddqqyy 的回复:
用户输入查询条件之后,一般都要再点击一个“查询”按钮才开始查询吧? 你就在按钮事件中加%嘛。
这个查询对话框要cxGrid自带的,不是我们自己设计的啊
董董 2013-08-03
  • 打赏
  • 举报
回复
用户输入查询条件之后,一般都要再点击一个“查询”按钮才开始查询吧? 你就在按钮事件中加%嘛。
zhengyc653 2013-08-03
  • 打赏
  • 举报
回复
引用 1 楼 ddqqyy 的回复:
用户输入“国”,你的代码就要包上%号。
关键是在哪里的代码加上%号?
董董 2013-08-03
  • 打赏
  • 举报
回复
用户输入“国”,你的代码就要包上%号。

5,916

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧