delphi 通过单击列标题对DBGrid进行排序

imzjd6km  于 2023-02-08  发布在  其他
关注(0)|答案(8)|浏览(244)

嗯,这看起来有点棘手(如果不是不可能的话)。我试图通过单击列标题来使DBGrid对数据进行排序。
问题是(遗憾的是)我正在使用 Delphi 3,我没有使用ADO数据集,查询得到了很多行,因此我无法重新打开我的TQuery,更改点击时的order by子句。
有人实现了这样的东西?

zsohkypk

zsohkypk1#

在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语句,即忽略括号中的注解“{..}”或单行注解“//”
问候

xfb7svmp

xfb7svmp2#

Delphi 有TClientDataset。并且TQuery可以使用在数据库上显式创建的索引来对IndexName属性上的数据进行排序。

6jjcrrmo

6jjcrrmo3#

以下是一些如何执行此操作的示例:Sorting records in Delphi DBGrid by Clicking on Column Title.
如前所述,如果您使用TClientDataSetTDBGridOnTitleClick中的cds.IndexFieldNames := Column.FieldName),排序非常简单,但是如果您不能做到这一点,您可以重新生成查询(您已经声明不想这样做)或获得更高级的数据网格,如Express Quantum Grid(我认为它允许您排序)。

ngynwnxp

ngynwnxp4#

在TDBGrid的OnTitleClick方法上,您可以编写以下简单代码:

procedure TForm1.DBGrid3TitleClick(Column: TColumn);
var
  cFieldName:string;
begin
  cFieldName:= DBGrid3.SelectedField.FieldName;
  AdoDataset1.Sort:=cFieldName;
end;
jum4pzuy

jum4pzuy5#

示例:(https://www.thoughtco.com/sort-records-in-delphi-dbgrid-4077301

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 pt: TGridcoord;
begin
 pt:= DBGrid1.MouseCoord(x, y);
 if pt.y=0 then
 DBGrid1.Cursor:=crHandPoint
 else
 DBGrid1.Cursor:=crDefault;
end;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  cFieldName:string;
begin
  Adotable1.Sort := Column.Field.FieldName;
end;
xt0899hw

xt0899hw6#

如果您正在使用TFDQueryTDataSourceTDBGrid的组合,您可以通过这种简单的方式订购!

procedure TFrmGer.DBGridTitleClick(Column: TColumn);
begin
  OrderByTitle(MyFDQuery, Column);
end;

将其放在帮助文件中,以便以后可以再次使用它。

procedure OrderByTitle(AQuery: TFDQuery; Column: TColumn);
begin
  AQuery.IndexFieldNames := Column.DisplayName;
end;
db2dz4w8

db2dz4w87#

升降模式

if Pos('DESC',PChar(Q2.Sort))>0 then
    Q2.Sort:=Column.FieldName  + ' ASC'
  else
    Q2.Sort:=Column.FieldName  + ' DESC';
9fkzdhlc

9fkzdhlc8#

这实际上是通过对数据集进行排序来完成的,然后网格会反映更改。通过在该列的数据集字段上创建索引,可以很容易地完成这一操作。当然,这只能在支持索引排序的数据集上完成,例如TClientDataset

相关问题