最近使用 cxGrid 这个表格控件,发现加载十几万笔数据时加载特别慢,同时用 DBGridEh 加载来对比,发现速度差异很大,
原来是 cxGrid 的 GridView 默认 GridMode=False ,此时加载数据集时会设置每一列的属性(例如把每一列的不同值转入筛选器中),
所以速度会慢很多,所以把 GridMode=True 后,速度和 DBGridEh 差不多了,但是问题来了,设置这个属性后,原本的点击
标题列功能无法排序,然后列筛序也不能使用。(要知道,这个2个功能是cxGrid 的特色,如果无法使用,那还不如使用DBGridEh)。
通过上网搜索了一下,基本能实现这2个功能,不过没有封装成通用的方法,还请大家多提出意见,代码如下:
1.标题点击排序功能:
procedure TForm1.cxGrid1DBBandedTableView1DataControllerSortingChanged(Sender: TObject);
vari:Integer;sortstr:string;
begintrysortstr:='';for i:= 0 to cxGrid1DBBandedTableView1.ColumnCount - 1 dobeginwith cxGrid1DBBandedTableView1.Columns[i] dobegincase SortOrder ofsoAscending:beginif sortstr<>'' thensortstr:=sortstr+',';sortstr:=sortstr+DataBinding.FieldName;end;soDescending:beginif sortstr<>'' thensortstr:=sortstr+',';sortstr:=sortstr+DataBinding.FieldName+' DESC';end;end;end;end;if sortstr<>'' thenad.Sort:=sortstr;finallyend;
end;
我用的是 adodataset 数据组件,加上以上代码可以多列排序。注意:需要添加 dxCore 单元才能使用 SoDescending 等变量。
2.实现列筛选代码如下:
varn,i: integer;field: string;
beginfield := 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 dobeginAValueList.Add(fvivalue,qy.FieldValues[field],vartostr(qy.FieldValues[field]),false);qy.Next;end;
end;
以上代码是加载没一列的筛选值列表;
procedure TForm1.cxGrid1DBBandedTableView1DataControllerFilterChanged(Sender: TObject);
beginad.Filtered:=False;if cxGrid1DBBandedTableView1.DataController.Filter.FilterText<>'' thenbeginad.Filter:=cxGrid1DBBandedTableView1.DataController.Filter.FilterText;Tryad.Filtered:=True;FinallyEnd; end;
end;
以上代码是当选择筛选值后,对应要执行的数据查询方法;
注意: 这个语句
ad.Filter:=cxGrid1DBBandedTableView1.DataController.Filter.FilterText;
不能直接这样写,需要转移一下,因为如果你的标题列标题是中文的话,那么这个 FilterText 也是中文的名字,
所以要把这个 FilterText 中的中文替换成对应的英文字段才可以使用。而且数据筛选后,
表格 DataController 的 recordcount 总数是不会变的,除非你的 DataSet 使用的是 Open 而不是过滤方式。
这样一来,有很多地方要写代码,很麻烦,如果数据量少,还是建议使用 GridMode=False 方式吧。