最近在找关于解决DBGridEh,DBGrid点击标题排序的最简单方法的同时,发现说法很多,但是没有找到一个比较详细的。
所以我在这里做一个小的总结,有不足之处请大家多多指教。
首先说下关于DBGridEh的排序,主要有两种解决方法。
1,只需设置属性,不需要写排序代码 //为什么要强调这里呢,因为在查资料的时候,很多人都说设置好属性就可以自动排序了,但都是只说其一,不说其二,等我慢慢到来
2,既需要设置属性,又需要写排序代码
首先直接利用控件连接好数据库,测试数据库为NorthWind,查询为customers表,如上图
首先,为什么我说第一种方法是只说其一,不说其二呢,因为很多人说设置好DBGridEh的属性就可以进行排序了
属性1:DBGridEh1-->OptionsEh-->dghAutoSortMarking 设置为True
属性2:DBGridEh1-->Columns-->Title-->TitleButton 设置为True
提醒:加入EhlibADO单元(我是使用ADO连接数据库,如果是BDE,就EhLibDBE单元)
好了,属性已经设置好了,那请你测试一下,是不是可以点击标题进行排序了呢?呵呵,测试过之后你会发现没有进行任何列的排序,是不是我们设置错了呢?
答案是,没有设置错属性,只是有个细节网上没有人提到过。就是只设置属性的话,我们必须自己添加编辑列,直接连接数据,再编辑列的属性,是不能实现排序的。如下图
这样,我们每一个列设置好FieldName和Title.TitleButton属性。再测试一下,添加进来的列,设置好属性之后,就可以不写任何代码来进行排序了(这就是很多人说我也设置好这些属性了为什么不能进行排序的原因)
-
上面的测试通过了之后,我们继续下面的工作,如果我们的不能再设计期指定好列,那怎么办?那么就要用过我上所提到的第2种方法了
DBGridEh属性还是可以先指定好,如果也不能指定,那也可以写代码指定这两个属性
然后,我们要做的工作,就是用动态设置列的属性,呵呵
2 var
3 ColEh:TColumnEh;
4 begin
5 ColEh: = DBGridEh1.Columns.Add;
6 ColEh.FieldName: = ' CompanyName ' ;
7 ColEh.Title.TitleButton: = True;
8
9 ColEh: = DBGridEh1.Columns.Add;
10 ColEh.FieldName: = ' ContactName ' ;
11 ColEh.Title.TitleButton: = True;
12
13 ADOQuery1.Active: = True;
14
15 end;
列属性设置好之后,我们就需要写关于点击标题排序的代码了(排序代码有很多,我这里给出一种,因为我复制下来就能直接使用,所有没有研究过,这里我也不做详细解释,有爱好的朋友自己另行研究吧)
2 begin
3 if Column.Title.SortMarker = smdowneh then
4 begin
5 ADOQuery1.Sort: = Column.FieldName;
6 end
7 else
8 begin
9 ADOQuery1.Sort: = Column.FieldName + ' DESC ' ;
10 end ;
11 end ;
12 /// 以上是用ADOQuery1
13
14 /// 以下是用TClientdataSet
15 procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
16 begin
17 OrderGrid(DataModule1.CdsOther,Column.FieldName);
18 end ;
19
20 procedure OrderGrid(DataSet:TClientDataset;OrderField: string );
21 var
22 i:integer;
23 begin
24 if DataSet.IndexFieldNames <> '' then
25 begin
26 i: = TClientDataSet(DataSet).IndexDefs.IndexOf( ' i ' + OrderField);
27 if i =- 1 then
28 begin
29 with Dataset.IndexDefs.AddIndexDef do
30 begin
31 Name: = ' i ' + OrderField;
32 Fields: = OrderField;
33 DescFields: = OrderField;
34 end ;
35 end ;
36 DataSet.IndexFieldNames: = '' ;
37 DataSet.IndexName: = ' i ' + OrderField;
38 end
39 else
40 begin
41 DataSet.IndexName: = '' ;
42 DataSet.IndexFieldNames: = OrderField;
43 end ;
44 end ;
45
接下来,我们说说DBGrid的排序,DBGrid的排序可能必须要写事件代码来完成了
使用ADOQuery
2 begin
3 if ADOQuery1.Sort = Column.FieldName then
4 begin
5 ADOQuery1.Sort: = Column.FieldName + ' DESC ' ;
6 end
7 else
8 begin
9 ADOQuery1.Sort: = Column.FieldName;
10 end ;
11 end ;
如果用的是TClientDataSet,如下
2 begin
3 if ClientDataSet1.IsEmpty then
4 begin
5 Exit;
6 end ;
7 if IndexName = ' 降序 ' then
8 begin
9 if ClientDataSet1.IndexName = ' Indexname ' then ClientDataSet1.DeleteIndex( ' Indexname ' );
10 ClientDataSet1.AddIndex( ' Indexname ' ,Column.FieldName,[],Column.FieldName, '' , 0 );
11 ClientDataSet1.IndexName: = ' Indexname ' ;
12 IndexName: = ' 升序 ' ;
13 end
14 else
15 begin
16 if ClientDataSet1.IndexName = ' Indexname ' then ClientDataSet1.DeleteIndex( ' Indexname ' );
17 ClientDataSet1.AddIndex( ' Indexname ' ,Column.FieldName,[], '' , '' , 0 );
18 ClientDataSet1.IndexName: = ' Indexname ' ;
19 IndexName: = ' 降序 ' ;
20 end ;
21 Clientdataset1.EnableControls;
22 ClientDataSet1.First;
23 end ;
方法还有很多,本人只是提供了,我在用,测试完成了几种方法。请大家多多指教