dbgrideh如何实现点击标题排序(50分)

  • 主题发起人 主题发起人 GrassDragon
  • 开始时间 开始时间
G

GrassDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
这是个用google一搜就很多的问题。所有的答案,都是直接对dbgrideh所绑定的记录集进行排序。
但是,我看到dbgrideh中有很多属性和方法都是和sort相关的,有没有不对记录集排序的方法,直接对dbgrideh排序。
 
//==============================================================================
// 点标题排序
// 多列排序,按CTRL同时鼠标点标题
// ADO排序,要uses ehlibado.pas
//==============================================================================

procedure Sort(grid: TDBGridEh);
begin
if ReadIniFile(GetAppPath+'db.ini','grid color','customcolor','')='y' then
begin
grid.RowSingleColor:=$00f7feef
//淡蓝
grid.RowDoubleColor:=$00f5f4f9
//粉红
end;

Grid.OptionsEh := Grid.OptionsEh + [dghAutoSortMarking];
Grid.ColumnDefValues.Title.TitleButton := True;
Grid.OptionsEh := Grid.OptionsEh + [dghMultiSortMarking];
Grid.SortLocal:=True;
end;
 
dbgrideh本身又没有数据,怎么排啊?
数据是在DataSet里面,当然要对DataSet排了.
 
HNXXCXG
我试了一下,您这段代码不能对数据排序呀!?
 
// ADO排序,要uses ehlibado.pas
 
1.我知道ADO怎么排序,我的问题是:
有没有,或者是有什么办法,可以直接对dbgrideh排序,而不对记录集排序的方法。
2.因为我的记录集中计算型字段和lookup字段,我不知道对这两种字段如何排序,所以才考虑不用ADO的排序,而用dbgrideh的排序.
如果有人知道如何对计算型字段和lookup字段进行排序和筛选,也是解决了我的问题,同样加分.
 
自动显示标题行的升降排序标志符(▽降序△升序)并做相应排序
DBGridEh组件可以在标题行单元格中显示小三角形升、降排序标志符图片,在运行时可点击标题行,图片自动切换并做相应排序。具体属性设置如下:

OptionsEh=dghAutoSortMarking
Column.Title.TitleButton=true

SortMarked Columns 为当前排序列可在运行时使用.
然后在该列的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为实际数据集变量名如:adoquery1
except
end;
end;
end;
 
to zhengjp:

Column.Title.TitleButton=true

这个属性在哪里设置呢?
 
其实现在的问题大部分在论坛的历史数据里都能查询到,希望大家养成一个好习惯:先查询后提问吧;

论坛历史资料 可以到
『Delphi园地』http://www.delphifans.com/

DELPHI盒子 www.2ccc.com 下载...

转某前人的方法:

EHLIB 的安装与实现单击标题栏自动排序
首先安装EHLib 3.6
方法:
1、当然是先要卸载以前安装的Ehlib组件了,在菜单的“Component”的“install Packeges”里,选择ehlib XX,选择“Remove”。

2、接下来在库里加入这个控件的引用路径,先新建一个文件夹,比如“D:/Component/Ehlib”(最好把要安装的控件都拷贝到这个Component目录下),然后把下载来的Ehlib压缩包里的Common和delphi7目录下的所有文件拷贝到Ehlib目录下,选择菜单里的“Tools“里的“EnvironMent Option”,选择“library“标签,在“library path”里加入控件的路径,比如为上面介绍的路径:“D:/Component/Ehlib”,如果你不是在对话框里选择加入路径的话,要在前面加上“;”号。

2、最后就是要安装组件了,然后打开Ehlib目录下的Ehlib70.dpk,选择“Compile”,编译一下,不要安装,随后再打开dclEhlib70.dpk进行安装,打开以后先“Compile“再选择“install”进行安装,组件面板上会出现Ehlib的组件页。

以下是重要 的一步:
[red] 把安装EHlib安装文件目录中的Dataservice文件夹中的所有文件复制到 你安装EHlib的目标目录中,里面有:[/b[/red]

引擎 数据集 单元文件

BDE TQuery EhLibBDE
ADO TADOQuery EhLibADO
ClientDataSet TClientDataSet EhLibCDS
DBExpress TSQLQuery EhLibDBX
InterBase Express TIBQuery EhLibIBX
等 的pas文件。
然后按如下方法操作:
1.在窗体上放置一个 DBGridEh 组件,并将其连接到相应的 ADO 数据集;
2.将该组件的[OptionsEn]中的 dgAutoSortMarking 属性设置为 True

3.双击该组件,在其弹出的属性编辑器中添加相关字段;
4.将要排序的字段的属性列表的 [Title]的 TitleButton 属性设置为 True

5.最后,千万不要忘了在 uses 子句中加上 EhlibADO单元。(手工输入)
OK,你就成功了。
打开 EHLibADO的pas文件,可以查看它的源码。可以看到它是如何实现排序功能的。
 
procedure TMasterDetailForm.DBGridEhTitleClick(Column: TColumnEh);
{ 数据网格按当前选择列排序 }
Var
wDSource:TDataSource;
wFieldName,wSort:String;
wSortMarker:TSortMarkerEh;
ADBGridEh:TDBGridEh;
begin
wSort:='';
ADBGridEh:=TDBGridEh(Column.Grid);
if (ADBGridEh.DataSource.DataSet).State<>dsBrowse then
begin
Application.MessageBox('请保存数据后再排序', '提示信息', MB_OK+MB_DEFBUTTON1+MB_APPLMODAL);
Exit;
end;
wDSource:=ADBGridEh.DataSource;
wSortMarker:=Column.Title.SortMarker;
wFieldName:=Column.FieldName;
With ADBGridEh do
begin
if wSortMarker = smUpEh then
Column.Title.SortMarker := smDownEh
else
Column.Title.SortMarker := smUpEh;
wDSource.DataSet.DisableControls;
try
//DataSource:=Nil;
try
if dghMultiSortMarking in ADBGridEh.OptionsEh then
begin
wSort:=SortDataSet(ADBGridEh);
if ((wDSource.DataSet) is TCustomADODataSet) then
((wDSource.DataSet) as TCustomADODataSet).Sort:=wSort;
end
else
begin
Case wSortMarker Of
smUpEh: begin
if ((wDSource.DataSet) is TCustomADODataSet) then
((wDSource.DataSet) as TCustomADODataSet).Sort :=wFieldName+ ' DESC';
end;
smDownEh:begin
if ((wDSource.DataSet) is TCustomADODataSet) then
((wDSource.DataSet) as TCustomADODataSet).Sort :=wFieldName+ ' ASC';
end;
End;
end;
except
end;
finally
wDSource.DataSet.EnableControls;
end;
DataSource:=wDSource;
end;
end;
 
后退
顶部