只要设置下面三个属性:
ColumDefValues->Title->TitleButton设为TRUE
sortlocal 设为TRUE
OptionsEH->dghautosortmarking设为TRUE
最后,一定要记得在pas文件的uses里引用上ehlib***,我这里的是ehlibCDS,网上也有的是ehlibBDE。我这里的情况是如果没有引用这个ehlibCDS,在点击dbgrideh表头时出现了小三角号,但就是不排序。
发现很多新手连设置DBGridEh自动排序方法都不知道,其实很简单的几步就行了,看下面的解决方法。
1.在窗体上放置一个 dbgrideh 组件,并将其连接到相应的 bde 数据集;
2.将该组件的[optionsen]中的 dgautosortmarking 属性设置为 true;
3.双击该组件,在其弹出的属性编辑器中添加相关字段;
4.将要排序的字段的属性列表的 [title]的 titlebutton 属性设置为 true;
5.最后,千万不要忘了在 uses 子句中加上 ehlibbde单元。
1.在optioneh中设置:
AutosortMarking:=True
2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)
sortlocal:=True;
3.uses 单元
Ado------ehlibADo
TclientData------ehlibCDS
BDE ---------ehlibBDE
4.Column属性
TitleButton:=True
在dbgrideh中直接点击title就可按点击的那个字段排序的方法
第一种方法(未测试)
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
//点击GridEh标题排序
if (Column.Title.SortMarker = smNoneEh) or (Column.Title.SortMarker = smDownEh) then
begin
ADOQuery1.SORT := COLUMN.FIELDNAME;
Column.Title.SortMarker := smUpEh
end
else
begin
ADOQuery1.SORT := COLUMN.FIELDNAME + ' DESC';
Column.Title.SortMarker := smDownEh
end;
end;
第二种方法(未测试)
procedure TPrintMai_frm.DBGridEh1TitleClick(Column: TColumnEh);
var
sortstring: string;
begin //进行排序
with Column do
begin
if FieldName = '' then
Exit;
case Title.SortMarker of
smNoneEh:
begin
Title.SortMarker := smDownEh;
sortstring := Column.FieldName + ' ASC';
end;
smDownEh: sortstring := Column.FieldName + ' ASC';
smUpEh: sortstring := Column.FieldName + ' DESC';
end; //数据集排序。
try
DM.DataModule1.qry2.Sort := sortstring //dataset为实际数据集变量名
except
end;
end;
end;
1.添加引用:DBClient
2.置DBGridEh控件属性:
设置dghAutoSortMarking属性为true
设置希望排序的Column的TitleButton属性为true
3.//表格排序过程
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;
4.在DBGridEh的OnTitleClick事件中调用
OrderGrid(DM.ClientDataset,Column.FieldName);
显示记录数的的方法:
with DBGridEh1 do
begin
SumList.Active := True;
FooterColor := clmoneygreen;//clGrayText;
Columns[0].Footer.ValueType := fvtStaticText;
Columns[0].Footer.Value := ’记录数’;
Columns[1].Footer.valuetype :=fvtCount;
SumList.Active := True;
FooterRowCount := 1;
end;
2单击标题排序
数据源为adoQuery
1、首先设置dbGridEh里需要排序的字段的Title->Titlebutton属性为true
2、设置dgGridEh的optionsEh->dbhautoSortMarking属性为true
3、在dbGridEh的ontitleButtonClick事件里面判断。
4 DBGridEh1.SortLocal := True;(ado 中没有写也可以)
5 在单击标题方法里
procedure TFrm_main.DBGridEh1TitleClick(Column: TColumnEh);
begin
if column.Title.SortMarker=smdowneh then
dm.ADOQuery_dq.Sort :=column.FieldName
else
dm.ADOQuery_dq.Sort :=column.FieldName +’ DESC’;
end;
实现 单击DBGridEh的标题栏自动排序:
只需设置相关属性就可以实现,不用添加任何代码,如下:
1.将DBGridEh d 属性:
OptionsEh下的dghAutoMariking 设为 True ;
2. 将DBGridEh d 属性:
sortLocal 设为True
这个属性不一定总要设置,与使用的数据连接有关。用的是Oracle数据库,刚开始没有设置这个属性,在排序的时候速度很慢,设置之后速度明显变快了。
3. 选中要排序的Column
将 Title 下的TitleButton 属性设为True
在网上查到有些方法,需要设置相应属性还要添加相关代码,转到这里来,如下:
1.添加引用:DBClient
2.置DBGridEh控件属性:
设置dghAutoSortMarking属性为true
设置希望排序的Column的TitleButton属性为true
3.//表格排序过程
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;
4.在DBGridEh的OnTitleClick事件中调用
OrderGrid(DM.ClientDataset,Column.FieldName);
dbgrideh如何实现点击标题排序
数据源为adoQuery
1、首先设置dbGridEh里需要排序的字段的Title->Titlebutton属性为true
2、设置dgGridEh的optionsEh->dbhautoSortMarking属性为true
3、在dbGridEh的ontitleButtonClick事件里面判断。
procedure Tfrmmain.dbgGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
begin
if column.Title.SortMarker=smdowneh then
adoQuery1.Sort :=column.FieldName
else
adoQuery1.Sort :=column.FieldName +' DESC';
end;
由于ADO用的MySql的三方控件mydac(TMyQuery),
按如下方法实现不了,请问该怎么做呢?
1.在optioneh中设置:
AutosortMarking:=True
2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)
sortlocal:=True;
3.uses 单元
Ado------ehlibADo
TclientData------ehlibCDS
BDE ---------ehlibBDE
4.Column属性
TitleButton:=True
不用这么复杂。DbgridEh排序不用写代码。
1.在OptionsEH中设置AutoSort...设置成True。
2.引用单元 EhlibADO,如果没有,请加入到搜索路径中。如果是BDE,就是EhlibBDE。
3.把需要排序的列和Title.TitleButton 设置为True。
自动显示标题行的升降排序标志符(▽降序△升序)并做相应排序
DBGridEh组件可以在标题行单元格中显示小三角形升、降排序标志符图片,在运行时可点击标题行,图片自动切换并做相应排序,
SortMarkedColumns 为当前排序列可在运行时使用.
然后在该列的ontitleclick事件中添加代码:
procedure TForm_Query.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
sortstring:string; //排序列
begin
//进行排序
with Column do
begin
if FieldName = '' then
Exit;
case Title.SortMarker of
smNoneEh:
begin
Title.SortMarker := smDownEh;
sortstring := Column.FieldName + ' ASC';
end;
smDownEh: sortstring := Column.FieldName + ' ASC';
smUpEh: sortstring := Column.FieldName + ' DESC';
end;
//进行排序
try
dataset.Sort := sortstring //dataset为实际数据集变量名
except
end;
end;
end;
切记lookup型字段不可做上述设置,否则系统会提示错误。
(不编程自动排序,将自动排序的属性设置完以后,记得要USE中加入EhlibAdo或者EhlibBDE、EhlibCDS这些单元的使用,具体哪个根据使用的数据库类型决定,但只能对查询类进行排序,table类是不行的,会报错。)
1、设置DBGridEh的OptionsEh里的dbhautoSortMarking属性为true
2、双击DBGridEh,添加你要显示的字段,然后设置需要排序的字段的Titlebutton属性为true
3、在DBGridEh的ontitleButtonClick事件添加如下代码:
procedure Tfrmmain.dbgGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;Column: TColumnEh);
begin
if column.Title.SortMarker=smdowneh then
adoQuery1.Sort :=column.FieldName //注意把数据源名称改成你自己的
else
adoQuery1.Sort :=column.FieldName +' DESC';
end;
如何使用 Ehlib 实现自动排序(delphi 园地文章)
---
在 Ehlib 的 DataService 文件夹下提供了一些可以使数据集实现自动排序的文件。TDBGridEh 使用这些文件中的相关对象可以实现当排序标记发生变化时实现自动排序。
如果你改变了数据网格及标题的排序标记而没有书写 OnSortMarkingChanged 事件,数据网格将尝试自动进行数据排序。DBGridEhDataService 尝试通过 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的对象。正如你所知道的,TDataSet 不支持数据排序,但它的派生对象 TQuery 或 TClientDataSet 却允许实现数据排序。使用过程 RegisterDatasetFeaturesEh ,你可以注册 TDatasetFeaturesEhClass 类,该类可以实现对 TQuery, TADOQuery 以及 TClientDataSet 对象进行排序。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。
引擎 数据集 单元文件
BDE TQuery EhLibBDE
ADO TADOQuery EhLibADO
ClientDataSet TClientDataSet EhLibCDS
DBExpress TSQLQuery EhLibDBX
InterBase Express TIBQuery EhLibIBX
【译【者注】:
实际上,实现该功能非常简单(以下我以BDE为例说明如何实现自动排序):
1.在窗体上放置一个 DBGridEh 组件,并将其连接到相应的 BDE 数据集;
2.将该组件的[OptionsEn]中的 dgAutoSortMarking 属性设置为 True;
3.双击该组件,在其弹出的属性编辑器中添加相关字段;
4.将要排序的字段的属性列表的 [Title]的 TitleButton 属性设置为 True;
5.最后,千万不要忘了在 uses 子句中加上 EhlibBDE单元。
好了,使用上面的方法,你会发现原来通过 Ehlib 实现数据的自动排序居然如些简单!
Ehlib3.0版本以上虽然支持排序功能,但不支持带有Order By的SQL语句,而且排序很慢;我写的这个排序函数,利用ADO的sort方法,排序很快,几万条数据也是很快。该函数支持Lookup字段排序,不支持计算字段排序,因为计算字段值在内存里高速运算。排序分为:升序、降序和默认三种,支持排序图标。
procedure SortDBGridEh(Sender: TObject; ACol: Integer;
Column: TColumnEh);
var
FieldName, SortStr: string;
begin
Screen.Cursor := crSQLWait;
try
if (Sender is TDBGridEh) and
((Sender as TDBGridEh).DataSource.DataSet <> nil) then
begin
if not ((Sender as TDBGridEh).DataSource.DataSet is TCustomADODataSet) then
Exit;
if not (Sender as TDBGridEh).DataSource.DataSet.Active then
Exit;
FieldName := Column.FieldName;
if (Sender as TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
Exit;
if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
fkData then
SortStr := FieldName
else if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
fkLookup then
FieldName := (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).KeyFields
else
FieldName := '';
if (FieldName = '') or (Pos(';', FieldName) > 0) then
Exit;
case Column.Title.SortMarker of
smNoneEh:
begin
Column.Title.SortMarker := smUpEh;
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort :=
FieldName;
end;
smUpEh:
begin
Column.Title.SortMarker := smDownEh;
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort :=
FieldName + ' DESC';
end;
smDownEh:
begin
Column.Title.SortMarker := smNoneEh;
TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort := '';
end;
end;
end;
finally
Screen.Cursor := crDefault;
end;
end;
--程序实现如下:
--在DBGridEh的事件OnTitleBtnClick引用该函数即可:
procedure TFrmU_BasicSetup.dbgAddrCodeTitleBtnClick(Sender: TObject;
ACol: Integer; Column: TColumnEh);
begin
SortDBGridEh(Sender, ACol, Column);
end;
--为了保证表格的每一列都能点击触发排序,你需要将你需要排序的列属性
-- Title->TitleButton设置为True。
数据源为adoQuery
1、首先设置dbGridEh里需要排序的字段的Title->Titlebutton属性为true
2、设置dgGridEh的optionsEh->dbhautoSortMarking属性为true
3、在dbGridEh的ontitleButtonClick事件里面判断。
procedure Tfrmmain.dbgGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
begin
if column.Title.SortMarker=smdowneh then
adoQuery1.Sort :=column.FieldName
else
adoQuery1.Sort :=column.FieldName +' DESC';
end;
EhLib使用心得(1):用DBGridEh实现点击列头自动排序数据
我使用的环境是Delphi7+IBX+EhLib3.6, 按EhLib的说明,DBGridEh不用专门写排序代码就可以实现点击列头自动排序数据,看它提供的Demo确实如此。但昨天搞了半天才搞定,发现还有一些细节设置需要注意。
一般给出的步骤都是这样:设置好DBGridEh数据集的连接后, 1、双击该组件,在其弹出的属性编辑器中添加相关字段; 2、将该组件的[OptionsEn]中的dghAutoSortMarking和dghMultiSortMarking属性设置为True; 3、将要排序的字段的属性列表的[Title]的TitleButton属性设置为True; 4、编译时一定要在uses子句中加上EhLib\DataService下相应的EhlibXXX单元。
使用多字段排序: dghMultiSortMarking要选true, 然后点击一列,然后按住ctrl,点其他列,则列标题会出现1,2的顺序标志,松开ctrl后排序起作用。
(TDBGridEh allows to show special sortmarking bitmaps (small triangles) in the right part of title cell. In order to automatically marking title by sortmarking bitmaps add dghAutoSortMarking to OptionsEh property. Add dghMultiSortMarking too in order to allow sortmarking several columns simultaneously. Set Column.Title.TitleButton to true for titles which will have possibility to change sortmarkers at run time. At runtime clicking on title will change sortmarking. Holding Ctrl key allows to mark several columns simultaneously. After user change sormarking grid call OnSortMarkingChanged event. You can write this event to change sorting and reopen in dataset. Use SortMarkedColumns property to access to sortmarked columns.)
至此就可以了,似乎很简单。但我按照这样的步骤设置后一运行就出现动态SQL语句错误。看了下EhLibIBX.pas(我用的是IBQuery),原来,TDBGridEh实现自动排序是TSQLDatasetFeaturesEh查找TIBQuery.SQL中以'ORDER BY'开头的行,然后替换这一整行为 'ORDER BY FieldNo1 [DESC],....'。所以,注意:如果TIBQuery.SQL中已经有'ORDER BY'语句,一定要让这一句单独占一行,否则TDBGridEh会把其他SQL语句也替换掉; 或者原本就没有'ORDER BY'语句,这样也能自动排序成功。
还要注意,上面的FieldNo1是要排序的字段的序号,而不是字段名。比如'SELECT NAME,AGE FROM TABLE_EMPLOYEE ORDER BY 2',就是对AGE字段排序。但是一定不能写成'SELECT * FROM TABLE_EMPLOYEE ORDER BY 2',否则就会出现无法定位字段位置的SQL错误!所以,TIBQuery.SQL中一定要明确写出查询的字段,而不能用'*',这样TDBGridEh才能成功执行自动排序。这个好象应该算SQL语法规则,发现自己基本的SQL语法还是很菜,呵呵,让我试了半天|||^_^...
其他数据库组件也是一样的(除了ClientDataSet),也都是重写SQL,在服务器端重新执行一次查询实现排序。这个我想效率一定不好,怪不得很多高手还是愿意自己写代码实现点击列头自动排序的功能。但如果使用ClientDataSet,可以设置TDBGridEh.SortLocal:=True实现本地排序。EhLib4好象专门增加了内存表组件,应该可以用它实现本地排序了。
“在 Ehlib 的 DataService 文件夹下提供了一些可以使数据集实现自动排序的文件。TDBGridEh 使用这些文件中的相关对象可以实现当排序标记发生变化时实现自动排序。
“如果你改变了数据网格及标题的排序标记而没有书写 OnSortMarkingChanged 事件,数据网格将尝试自动进行数据排序。
“DBGridEhDataService尝试通过 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的对象。正如你所知道的,TDataSet 不支持数据排序,但它的派生对象 TQuery 或 TClientDataSet 却允许实现数据排序。
“使用过程 RegisterDatasetFeaturesEh ,你可以注册 TDatasetFeaturesEhClass 类对指定的数据集排序。
“EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
“对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。
“引擎 数据集 单元文件
BDE TQuery EhLibBDE
ADO TADOQuery EhLibADO
ClientDataSet TClientDataSet EhLibCDS
DBExpress TSQLQuery EhLibDBX
InterBaseExpress TIBQuery EhLibIBX”
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/archive/2012/04/05/2433079.html
浙公网安备 33010602011771号