2

私はDelphiの初心者であり、アドバイスが必要です。

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)にロードされ、データベースへの別のクエリなしで、メモリ内でのみデータを並べ替える必要があります。

ありがとうございました

4

2 に答える 2

3

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

Grid.PageMode := False;
于 2011-04-19T14:07:44.610 に答える
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

よろしく、
ラドゥ

于 2011-04-19T08:04:13.477 に答える