关于 cxGrid 的过滤问题

http://bbs.csdn.net/topics/390536919

关于 cxGrid 的过滤问题 [问题点数:20分,结帖人zhengyc653]

不显示删除回复
           
显示所有回复
           
显示星级回复
           
显示得分回复
           
只显示楼主
          收藏

zhengyc653 

结帖率:95.45%

本帖最后由 zhengyc653 于 2013-08-03 15:17:16 编辑

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

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

发表于: 2013-08-03 15:14:15 楼主

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

回复次数:14

CSDN推荐
董董 


用户输入“国”,你的代码就要包上%号。

回复于: 2013-08-03 15:23:17#1 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


引用 1 楼 ddqqyy 的回复:

用户输入“国”,你的代码就要包上%号。

关键是在哪里的代码加上%号?

回复于: 2013-08-03 15:38:26#2 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

董董 


用户输入查询条件之后,一般都要再点击一个“查询”按钮才开始查询吧?

你就在按钮事件中加%嘛。

回复于: 2013-08-03 15:45:31#3 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


引用 3 楼 ddqqyy 的回复:

用户输入查询条件之后,一般都要再点击一个“查询”按钮才开始查询吧?

你就在按钮事件中加%嘛。

这个查询对话框要cxGrid自带的,不是我们自己设计的啊

回复于: 2013-08-03 15:47:52#4 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

22222bbb 


二楼没明白楼主的意思。同求解决方法

回复于: 2013-08-03 15:52:58#5 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


自己顶一下.... 难道没人遇到这个问题?

回复于: 2013-08-06 08:26:33#6 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

simonhehe 

  

lz的需求, 只能改dev的代码实现

like的匹配情况有: %国%   国%   %国
你需求的[包含], 匹配情况只有: %国%

回复于: 2013-08-06 10:24:08#7 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


引用 7 楼 simonhehe 的回复:

lz的需求, 只能改dev的代码实现

like的匹配情况有: %国%   国%   %国
你需求的[包含], 匹配情况只有: %国%

我也不知道要改Dev的代码,可跟踪来跟踪去,就是不知道要在哪改!

回复于: 2013-08-06 10:41:35#8 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


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

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

procedure TfmFilterControlDialog.ApplyFilter;

begin

  SetControlsEnabled(False);

  DoBeforeApply;

  try

    FilterControl.ApplyFilter;

  finally

    DoAfterApply;

    SetControlsEnabled(True);

  end;

end;

继续跟踪 DoBeforeApply ,发现其也是一个虚方法:

Delphi/Pascal code

?


1

2

3

4

5

procedure TfmFilterControlDialog.DoBeforeApply;

begin

  if Assigned(FOnBeforeApply) then

    FOnBeforeApply(Self);

end;

又发现 FOnBeforeApply 的声明为:
FOnBeforeApply: TNotifyEvent;
到这,就不懂得如何往下跟踪了...  

回复于: 2013-08-06 10:53:58#9 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


filterControl.ApplyFilter;
filterControl 这个对象在哪? 在这个单元好像没找到这个对象
不知道是引引哪个单元的东东

回复于: 2013-08-06 11:02:16#10 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

simonhehe 

  

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

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

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

12

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;

回复于: 2013-08-06 17:52:49#11 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


引用 11 楼 simonhehe 的回复:

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

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

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

12

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;

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

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

回复于: 2013-08-06 22:56:45#12 得分:0

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

simonhehe 

  

之前的修改全部取消.

一下改动完成后, 所有使用该文件做过滤的, 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;

回复于: 2013-08-07 09:14:21#13 得分:20

对我有用[0] | 丢个板砖[0] | 引用 | 举报| 管理

zhengyc653 


非常感谢 simonhehe 的热心助助!!问题解决,分不多,全给你了。

原文地址:https://www.cnblogs.com/westsoft/p/8503918.html

时间: 2024-11-05 13:04:03

关于 cxGrid 的过滤问题的相关文章

cxgrid过滤使用心得

[delphi] view plain copy uses cxFilter; cxgrid过滤条件清除:cxgrdbtblvwGrid1DBTableView2.DataController.Filter.AutoDataSetFilter:=True;                                     cxgrdbtblvwGrid1DBTableView2.DataController.Filter.Clear;cxgrid过滤条件添加:cxgrdbtblvwGrid

分享Delphi处理EXCEL源码

分享Delphi处理EXCEL源码,源码如下: (****************************************************************************************) var FExcelApp:Variant;                                         // Excel App  FCellRange:Variant;                                       

cxGrid实现取消过滤和排序后定位到首行(单选和多选)

cxGrid实现取消过滤和排序后定位到首行(单选和多选) 原创 2013年10月06日 18:42:24 2107 DataContoller中的函数FocusedRecordIndex没有反应,FocusedRowIndex正常. cxgrdtvGrid1DBTableView1.DataController.FocusedRecordIndex := 0; //定位到第一行,排序过滤无反应 cxgrdtvGrid1DBTableView1.DataController.FocusedRowI

如何访问cxGrid控件过滤后的数据集

var I: Integer; begin Memo1.Lines.Clear; with cxGrid1DBTableView1.DataController do for I := 0 to FilteredRecordCount - 1 do Memo1.Lines.Add(DisplayTexts[FilteredRecordIndex[I], 0]); end; https://www.devexpress.com/Support/Center/Question/Details/A38

Delphi : cxGrid的使用方法

1. 去掉cxgrid中抬头的box ,在tableview1的ptionsview的groupbybox=false; 2. 在GRID footer 中加入sum(列), tableview1的optionsview的footer=ture然后在cxGRid1的customize中的summary 的footer.add需要合计的列kind= skSum3. 去掉cxgrid 中的过滤下拉箭头选择tableview1.optionscustomize.columnfiltering=fasl

delphi CxGrid用法总结(63问)

1. 去掉cxGrid中台头的Box 解决:在tableview1的optionsview的groupbybox=false; ***************************************************************************** 2.统计功能 解决:(1) tableview tableview1的optionsviewfooter=ture 然后在cxGRid1的customize..中的summary 的footer.add需要合计的列k

cxgrid属性说明,每次用的时候费时费力查找。

转 cxgrid属性说明 TCXGRID控件:属性:ActiveLevel: 当前层BorderStyle: 窗口风格Color: 颜色FocusedView: 当前View;Font: 字体LevelTabs: 类似PageControls头设置  CaptionAlgnment:标题对齐方式  Images:图标  Style:风格Levels:RootLevelOptions:层选项  DetailTabsPosition: 类似PageControls头显示位置;  TabsForEmp

delphi CXGRID用法 (取行、列值;定位选中某行等等)

CXGRID用法 (取行.列值:定位选中某行等等) Delphi Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值 cxGrid1DBTableView1.Controller.FocusedRowIndex 当前行号 cxGrid1DBTableView1.Controller.FocusedRow 当前行 cxGrid1DBTableView1.Controller.FocusedColumn 当前列 cxGrid1DBTableView1.Controller.Focused

cxGrid用法-最新

cxGrid用法步1.你先放一个cxGrid,设置好View,设置View.DataController连接的DataSource 2.激活DataSource连接的DataSet,双击cxGrid,点击Retrieve Fields,取得所有的Column 3.设置View的OptionsView.Footer=True,OptionsView.GroupFooters=True,这是为了把分组小计和总计面板显示出来 4.将“订单号”字段拖到cxGrid上方的分组面板(GroupbyBox),