zoukankan      html  css  js  c++  java
  • 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 方式吧。

  • 相关阅读:
    阶梯式测试
    websocket协议
    性能指标
    环境变量
    解密断言+参数写入文本
    将参数进行URL编码
    日志级别
    对返回结果进行断言
    python小题目:循环/函数
    如果使用JSON提取器 和正则提取器
  • 原文地址:https://www.cnblogs.com/lpq21314/p/6010998.html
Copyright © 2011-2022 走看看