2011-04-19 9 views
2

私はDelphiの初心者です。アドバイスが必要です。Delphi7 TMS TDBAdvGrid列ヘッダーがクリックされたときにデータを並べ替えます。

私はTMS TDBAdvGridを使用しています。ユーザーが列のヘッダーをクリックしているときにデータを並べ替える必要があります。私はグリッドのソート設定をセットアップし、onclicksortイベントのコードを書いていますが、動作していません。

グリッドのソート設定:

SortSettings.Show = True; 
SortSettings.IgnoreBlanks = True; 
SortSettings.BlankPos = blLast; 

onclicksortイベント:

try 
    try 
     if FSortISWorking then 
     Exit; 
     FSortISWorking := true; 

     if ACol < 0 then 
     begin 
     grid.BeginUpdate; 
     grid.SortSettings.Column := ACol; 
     Application.ProcessMessages; 
     grid.QSort; 
     grid.EndUpdate; 
     end; 
    except on e: Exception do 
     begin 
     // log the error 
     end; 
    end; 
    finally 
     FSortISWorking := false; 
    end; 

グリッドはデータベースに直接リンクされていません。データはメモリ(TClientDataSet)にロードされ、データベースへの別のクエリを使わずにメモリ内のデータのみをソートする必要があります。

ありがとう

答えて

3

あなたの例を試してみましたが、これは私の問題を解決しました:

Grid.PageMode := False; 
+0

ありがとうございます。この解決策が働いた。唯一の問題は、プロパティがfalseの場合、データセットへの接続が閉じられていることです。 – Andrei

+0

TMSのドキュメントを見ると、両方を持つことはできないようです。 PageMode =データ編集の場合はTrue、ソートの場合はPageMode = Falseのいずれかです。これについて詳しくは、「TMS TDBAdvGrid.pdf」を参照してください。単に「PageMode」を検索してください。私は過去にもこれと苦労し、Raduの解決策に進まなければならなかった - データをデータベースレベルで並べ替えて、データを編集できるようにする: - / –

1

この問題を解決するには、グリッドの後ろにデータセットを配置する必要があります。ここでは一般的にこれを行う方法があります:http://delphi.about.com/od/usedbvcl/l/aa042203a.htm。

は、あなたが例を持って怒鳴る:

procedure TForm1.DBAdvGrid1CanSort(Sender:TObject; ACol: Integer; var DoSort: Boolean); 

var fldname:string; 
begin 
DoSort := False; // disable internal sort 

// toggle sort order if 
dbadvgrid1.SortSettings.Direction = sdAscending then 
dbadvgrid1.SortSettings.Direction := sdDescending else 
dbadvgrid1.SortSettings.Direction := sdAscending; 

// get field name of the column 
clicked fldname :=query1.FieldList.Fields[ACol -1].FieldName; 

if pos(' ',fldname) 0 then fldname:= 'biolife.db."'+fldname+'"'; 

// add ORDER BY clause to the query 
query1.SQL.Text := 'select * from 
biolife.db ORDER BY '+fldname; 

if dbadvgrid1.SortSettings.Direction = 
sdDescending then query1.SQL.Text := 
query1.SQL.Text + ' DESC'; 

query1.Active := true; 
DBAdvGrid1.SortSettings.Column := ACol; 
end; 

あなたがここにあなたのClientDataSetのを注文したい場合は、あなたがそれを行う方法があります。

http://edn.embarcadero.com/article/29056

よろしく、
ラドゥ

関連する問題