3

うーん、これは少しトリッキーに思えます (不可能ではないにしても)。列のタイトルをクリックして、DBGrid でデータを並べ替えようとしています。

問題は、私が (悲しいことに) Delphi 3 で作業していることです。私は ADO DataSets を使用しておらず、クエリは多くの行を取得するため、order byクリックの句を変更して TQuery を再度開くことはできません。

誰かがこのようなものを実装しましたか?

4

7 に答える 7

7

これは実際にはデータセットを並べ替えることで行われ、グリッドに変更が反映されます。その列のデータセット フィールドにインデックスを作成することで、簡単に実行できます。もちろん、これは などのインデックスの並べ替えをサポートするデータセットでのみ実行できますTClientDataset

于 2009-07-17T22:19:15.390 に答える
3

TDBGrid の OnTitleClick メソッドでは、次のようなことができます...

procedure TfmForm1.DBGrid1TitleClick(Column: TColumn);
var
   i: Integer;
begin
   // apply grid formatting changes here e.g. title styling
   with DBGrid1 do
      for i := 0 to Columns.Count - 1 do
         Columns[i].Title.Font.Style := Columns[i].Title.Font.Style - [fsBold];
   Column.Title.Font.Style := Column.Title.Font.Style + [fsBold];

   with nxQuery1 do // the DBGrid's query component (a [NexusDB] TnxQuery)
   begin
      DisableControls;
      if Active then Close;
      for i := 0 to SQL.Count - 1 do
         if (Pos('order by', LowerCase(SQL[i])) > 0) then
            //NOTE: ' desc' The [space] is important
            if (Pos(' desc',LowerCase(SQL[i])) > 0) then 
               SQL[i] := newOrderBySQL
            else
               SQL[i] := newOrderBySQL +' desc';
      // re-add params here if necessary
      if not Active then Open;
      EnableControls;
   end;
end;

これを最適化する方法はたくさんありますが、使用するコンポーネントの機能によって異なります。上記の例ではクエリ コンポーネントを使用していますが、テーブル コンポーネントを使用した場合は、'order by' 句の代わりに使用するインデックスを変更します。

ここでの SQL の処理は、非常に基本的なバージョンです。SQL バッチ ステートメントなどを処理しないため、複数の 'order by..' 句またはコメント化された SQL ステートメントが発生する可能性があります。つまり、角かっこで囲まれたコメント "{..}" や単一行コメント "//" は無視されます。

よろしく

于 2013-04-24T01:36:21.477 に答える
0

Delphi3にはがありTClientDatasetます。またTQuery、データベースに明示的に作成されたインデックスを使用して、プロパティのデータを並べ替えることができIndexNameます。

于 2009-07-18T04:18:45.597 に答える
0

これを行う方法の例を次に示します。列のタイトルをクリックして、Delphi DBGrid でレコードを並べ替える

TClientDataSetすでに述べたように、 (cds.IndexFieldNames := Column.FieldNameの でOnTitleClick)を使用している場合、並べ替えは非常に簡単ですTDBGrid。ただし、これができない場合は、クエリを再生成するか (やりたくないことを述べています)、Express Quantum Grid (ソートできると思います) などのより高度なデータ グリッドを取得できます。

于 2009-07-19T22:08:29.210 に答える
0

TDBGrid の OnTitleClick メソッドで、次の簡単なコードを記述できます。

procedure TForm1.DBGrid3TitleClick(Column: TColumn);
var
  cFieldName:string;
begin
  cFieldName:= DBGrid3.SelectedField.FieldName;
  AdoDataset1.Sort:=cFieldName;
end;
于 2017-09-08T04:00:05.633 に答える