DBGridEh,DBGrid点击标题排序

最近在找关于解决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属性还是可以先指定好,如果也不能指定,那也可以写代码指定这两个属性

然后,我们要做的工作,就是用动态设置列的属性,呵呵

 

 1  procedure  TForm1.FormCreate(Sender: TObject);
 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;

 

 

列属性设置好之后,我们就需要写关于点击标题排序的代码了(排序代码有很多,我这里给出一种,因为我复制下来就能直接使用,所有没有研究过,这里我也不做详细解释,有爱好的朋友自己另行研究吧)

 1  procedure  TForm1.DBGridEh1TitleClick(Column: TColumnEh);
 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 
 
http://www.delphifans.com/infoView/Article_615.html 这里也有一个方法,由于本人没有测试通,也没有花费时间在上面,有兴趣的朋友自己看

 

接下来,我们说说DBGrid的排序,DBGrid的排序可能必须要写事件代码来完成了

 使用ADOQuery

 1  procedure  TForm1.DBGrid1TitleClick(Column: TColumn);
 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,如下

 

var
  IndexName:String;
 1  procedure  TFrmMain.DBGrid1TitleClick(Column: TColumn);
 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 ;

 

 

方法还有很多,本人只是提供了,我在用,测试完成了几种方法。请大家多多指教

 

 

转载于:https://www.cnblogs.com/zshsuming/archive/2010/03/19/1689667.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值