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

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

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 procedure TForm1.FormCreate(Sender: TObject);
var
ColEh:TColumnEh;
begin
ColEh:=DBGridEh1.Columns.Add;
ColEh.FieldName:='CompanyName';
ColEh.Title.TitleButton:=True;

ColEh:=DBGridEh1.Columns.Add;
ColEh.FieldName:='ContactName';
ColEh.Title.TitleButton:=True;

ADOQuery1.Active:=True;

end;

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

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
if Column.Title.SortMarker=smdowneh then
begin
ADOQuery1.Sort:=Column.FieldName;
end
else
begin
ADOQuery1.Sort:=Column.FieldName+' DESC';
end;
end;
///////////////////////////////////////////////////////////////////////////////以上是用ADOQuery1

///////////////////////////////////////////////////////////////////////////////以下是用TClientdataSet
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
OrderGrid(DataModule1.CdsOther,Column.FieldName);
end;

procedure OrderGrid(DataSet:TClientDataset;OrderField:string);
var
i:integer;
begin
if DataSet.IndexFieldNames<>'' then
begin
i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+OrderField);
if i=-1 then
begin
with Dataset.IndexDefs.AddIndexDef do
begin
Name:='i'+OrderField;
Fields:=OrderField;
DescFields:=OrderField;
end;
end;
DataSet.IndexFieldNames:='';
DataSet.IndexName:='i'+OrderField;
end
else
begin
DataSet.IndexName:='';
DataSet.IndexFieldNames:=OrderField;
end;
end;

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

 使用ADOQuery

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if ADOQuery1.Sort=Column.FieldName then
begin
ADOQuery1.Sort:=Column.FieldName+' DESC';
end
else
begin
ADOQuery1.Sort:=Column.FieldName;
end;
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;

 

 

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






posted on 2012-04-05 14:16  del88  阅读(34)  评论(0)    收藏  举报