做的一个项目中,dbgrideh某一列点击标题排序,出现莫名其妙的问题,排出顺序根本不对,乱七八糟。
最后发现是 adoquery的sql语句问题:
select a.*,b.*,c.* from a left outer join b on a.电表ID=b.电表ID
left outer join c on a.电表ID= c.电表ID
adoquery中就会有3个电表ID的字段,当我重新优化sql语句只保留一个电表ID后,点击标题排序正常!
我认为在dbgrideh的TitleBtnClick事件里的参数Column应该可以正确识别出是哪个电表ID,难道是dbgrideh的BUG?
-----------------------------------------------------------------
顺便记两个有关标题排序的东西
1、设置dghAutoSortMarking属性为true
2、设置希望排序的Column的TitleButton属性为true
3、uses列表中增加EhlibAdo
这样就可以了,不需要写代码。
这种做法的确简单省事,但弊病是速度慢,它应该是将dbgrideh关联的数据集控件的sql语句加上“order by field”
然后重新关闭打开数据集。如果你的sql语句中有 order by 的话,dbgrideh点击标题就会报错
-----------------------------------------------------------------
procedure TFrmDBCZ_CZCBSH.DBGridEh_DJTitleBtnClick(Sender: TObject;
ACol: Integer; Column: TColumnEh);
begin
inherited;
SortDBGridEh(Sender,ACol,Column);
end;

procedure SortDBGridEh(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
FieldName :
string
;
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
TCustomADODataSet((Sender
as
TDBGridEh).DataSource.DataSet).Sort :
=
FieldName
+
'
DESC
'
;
end;
smUpEh:
begin
TCustomADODataSet((Sender
as
TDBGridEh).DataSource.DataSet).Sort :
=
FieldName
+
'
DESC
'
;
end;
smDownEh:
begin
TCustomADODataSet((Sender
as
TDBGridEh).DataSource.DataSet).Sort :
=
FieldName;
end;
end;
end;
finally
Screen.Cursor :
=
crDefault;
end;
end;
最后发现是 adoquery的sql语句问题:
select a.*,b.*,c.* from a left outer join b on a.电表ID=b.电表ID
left outer join c on a.电表ID= c.电表ID
adoquery中就会有3个电表ID的字段,当我重新优化sql语句只保留一个电表ID后,点击标题排序正常!
我认为在dbgrideh的TitleBtnClick事件里的参数Column应该可以正确识别出是哪个电表ID,难道是dbgrideh的BUG?
-----------------------------------------------------------------
顺便记两个有关标题排序的东西
1、设置dghAutoSortMarking属性为true
2、设置希望排序的Column的TitleButton属性为true
3、uses列表中增加EhlibAdo
这样就可以了,不需要写代码。
这种做法的确简单省事,但弊病是速度慢,它应该是将dbgrideh关联的数据集控件的sql语句加上“order by field”
然后重新关闭打开数据集。如果你的sql语句中有 order by 的话,dbgrideh点击标题就会报错
-----------------------------------------------------------------

















































