最後發現是 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點擊標題就會報錯
-----------------------------------------------------------------
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;