dbgrideh排序的奇怪問題

做的一個項目中,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;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章