cxGrid 在 GridMode = True 模式下实现标题点击排序以及标题列过滤筛选!!!

最近使用 cxGrid 这个表格控件,发现加载十几万笔数据时加载特别慢,同时用 DBGridEh 加载来对比,发现速度差异很大,

原来是 cxGrid 的 GridView 默认 GridMode=False ,此时加载数据集时会设置每一列的属性(例如把每一列的不同值转入筛选器中),

所以速度会慢很多,所以把 GridMode=True 后,速度和 DBGridEh 差不多了,但是问题来了,设置这个属性后,原本的点击

标题列功能无法排序,然后列筛序也不能使用。(要知道,这个2个功能是cxGrid 的特色,如果无法使用,那还不如使用DBGridEh)。

通过上网搜索了一下,基本能实现这2个功能,不过没有封装成通用的方法,还请大家多提出意见,代码如下:

1.标题点击排序功能:

procedure TForm1.cxGrid1DBBandedTableView1DataControllerSortingChanged(
  Sender: TObject);
var
  i:Integer;
  sortstr:string;
begin
    try
      sortstr:='';
      for i:= 0 to cxGrid1DBBandedTableView1.ColumnCount - 1 do
      begin
        with  cxGrid1DBBandedTableView1.Columns[i] do
        begin
          case  SortOrder  of
            soAscending:
                begin
                  if sortstr<>'' then
                    sortstr:=sortstr+',';
                  sortstr:=sortstr+DataBinding.FieldName;
                end;
            soDescending:
                begin
                  if sortstr<>'' then
                    sortstr:=sortstr+',';
                  sortstr:=sortstr+DataBinding.FieldName+' DESC';
                end;
          end;
        end;
      end;
      if sortstr<>'' then
        ad.Sort:=sortstr;
    finally
    end;
end;

 我用的是 adodataset 数据组件,加上以上代码可以多列排序。注意:需要添加  dxCore 单元才能使用 SoDescending 等变量。

2.实现列筛选代码如下:

var
  n,i: integer;
  field: string;
begin
  field := cxGrid1DBBandedTableView1.Columns[AItemIndex].DataBinding.FieldName;

  qy.close;
  qy.SQL.Clear;
  qy.SQL.Add('select distinct '+field+' from mbrecord ');
  qy.Open;

  n := qy.RecordCount;
  qy.First;
  for i := 0 to n-1 do
  begin
    AValueList.Add(fvivalue,qy.FieldValues[field],vartostr(qy.FieldValues[field]),false);
    qy.Next;
  end;
end;

 以上代码是加载没一列的筛选值列表;

 

procedure TForm1.cxGrid1DBBandedTableView1DataControllerFilterChanged(
  Sender: TObject);
begin
  ad.Filtered:=False;
  if cxGrid1DBBandedTableView1.DataController.Filter.FilterText<>'' then
  begin
    ad.Filter:=cxGrid1DBBandedTableView1.DataController.Filter.FilterText;
    Try
      ad.Filtered:=True;
    Finally
    End; 
  end;
end;

 以上代码是当选择筛选值后,对应要执行的数据查询方法;

   注意: 这个语句

ad.Filter:=cxGrid1DBBandedTableView1.DataController.Filter.FilterText;

不能直接这样写,需要转移一下,因为如果你的标题列标题是中文的话,那么这个 FilterText 也是中文的名字,

所以要把这个 FilterText 中的中文替换成对应的英文字段才可以使用。而且数据筛选后,
表格 DataController 的 recordcount 总数是不会变的,除非你的 DataSet 使用的是 Open 而不是过滤方式。
这样一来,有很多地方要写代码,很麻烦,如果数据量少,还是建议使用 GridMode=False 方式吧。

转载于:https://www.cnblogs.com/lpq21314/p/6010998.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值